servlet概念,生命周期,过滤器Filter

本文详细介绍了Servlet的概念、生命周期、API及其在Web应用程序中的作用。讲解了Servlet的部署方式,包括注解和web.xml配置,并探讨了servlet的启动顺序。此外,还阐述了过滤器Filter的使用,以及URL路径映射的规则。在实际应用中,通过Servlet进行登录验证项目,涉及数据校验、页面跳转和参数设定。最后,提到了如何通过Filter实现请求的预处理,如字符编码的统一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、servlet概念

servlet是运行在服务器端的应用程序,是由java编写,必须依赖于web容器(tomcat)运行,它的运行只能是由tomcat启动运行
客户端通过一个url地址访问该servlet,由tomcat去调用执行该servlet

二、servlet的生命周期
init()在servlet第一次加载的时候执行该方法,而且只会被执行一次
service() 执行,每调用一次servlet,就会执行一次service(),该方法不需要重写,该方法已经被父类实现,
由servcie去判断是调用doGet()还是doPost()
destroy() 在web容器(tomcat)关闭时,调用该方法,而该方法也是只会执行一次

三、servlet api

 HttpServlet    
          doGet(HttpServeltRequest request , HttpServletResponse response){}
 GenericServlet   
          service(ServletRequest req , ServletResponse res){}
 ServletConfig   Servlet   Serializable
 HttpSession session
 ServletContext  application

四、第一个servlet

 public class MyServlet extends HttpServlet{
      public void doGet(HttpServletRequest request , HttpServletResponse response){
           //具体的功能实现
      }
      public void doPost(HttpServletRequest request , HttpServletResponse response){
           doGet(request , response);
      }
 }

五、servlet的部署
两种部署方式:
(1)注解的方式,在servlet类的上面定义一个@WebServlet(部署的servlet的路径)
@WebServlet("/login/fs")
@WebServlet("/login/fs.do") 省略了value的属性名 @WebServlet(value="/login/fs.do")
@WebServlet(name = “abc”,value = “/admin/login.do”) 当有其他属性的时候,value属性名不能省略
@WebServlet(name = “abc”,urlpatterns ={ “/admin/login.do”,“/user/login.do”})
(2) web.xml配置servlet

<servlet>
     <servlet-name>abc</servlet-name>
     <servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
</servlet>
<!-- @WebServlet(name = "abc",value = "/admin/login.do") -->
<servlet-mapping>
      <servlet-name>abc</servlet-name>
      <url-pattern>/admin/login.do</url-pattern>
</servlet-mapping>
          
   扩展:
    <servlet>
         <servlet-name>abc</servlet-name>
         <servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
    </servlet>
    <!-- @WebServlet(name = "abc",value = "/admin/login.do") -->
    <servlet-mapping>
          <servlet-name>abc</servlet-name>
          <url-pattern>/admin/login.do</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
          <servlet-name>abc</servlet-name>
          <url-pattern>/admin/login2.do</url-pattern>
    </servlet-mapping>

   简化:
   <servlet>
         <servlet-name>abc</servlet-name>
         <servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
          <servlet-name>abc</servlet-name>
          <url-pattern>/admin/login.do</url-pattern>
          <url-pattern>/admin/login2.do</url-pattern>
          <url-pattern>/admin/login3.do</url-pattern>
          <url-pattern>/user/login4.do</url-pattern>
    </servlet-mapping>              
         

登录验证项目

login.jsp 表单可输入用户名和密码,点击确认登录
----》login.do(servlet) —>获取表单的数据用户名和密码并调用
—》LoginDao.java(jdbc连接数据库并校验用户名和密码)
-------》index.jsp 校验成功,
----->StudentDao.java(查询所有的学生并返回)跳转到主页index.jsp (显示表格,所有学生的信息)
-------》fail.jsp 校验失败,用户名密码错误

注意点:(1)页面的跳转 jsp—》servlet—》jsp
(2)jsp为了祛除java代码,使用el和jstl,就会使用到四大范围的值,请求转发和重定向所能支持的范围

六、参数设定
(1)上下文参数
web.xml

age
21

//在servlet中可以通过ServetContext获取context-param里的值
String age = getServletContext().getInitParameter(“age”);

(2)servlet的参数
只能该servlet访问 web.xml

abc
org.lanqiao.servlet.FirstServlet

age
22

//获取servlet的参数
String age2 = getInitParameter(“age”);

(3) servlet的启动顺序
默认的servlet,tomcat启动的时候并没有加载servlet,只有第一次访问servlet的时候,tomcat才加载该servlet
能不能只要一启动tomcat就先把servlet加载呢?

     <load-on-startup>1</load-on-startup>
<servlet>
     <servlet-name>abc</servlet-name>
     <servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
     <init-param>
     	<param-name>age</param-name>
     	<param-value>22</param-value>
     </init-param>
     <!-- 一启动tomcat,该servlet就被加载到tomcat中了,执行了init(),正数的值越小,启动该servlet的优先级越高。 -->
     <load-on-startup>1</load-on-startup>
</servlet>

七、过滤器Filter(类似servlet)

<context-param>
   	   <param-name>encoding</param-name>
       <param-value>utf-8</param-value>
</context-param>

<filter>
	<filter-name>mf</filter-name>
	<filter-class>org.lanqiao.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>mf</filter-name>
    <!-- 拦截所有的url请求 -->
    <url-pattern>*.do</url-pattern>
</filter-mapping>
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//HttpServletRequest req = (HttpServletRequest) request;
		String encoding = request.getServletContext().getInitParameter("encoding");
		//设置request对象中的数据为utf-8格式
		request.setCharacterEncoding(encoding);
		System.out.println("写入日志,"+request.getParameter("name")+"登录在"+new Date().toLocaleString());
		chain.doFilter(request, response);
		response.setCharacterEncoding(encoding);
		System.out.println("写入日志,显示页面");
	

八、url路径映射
@WebServlet("/login.do")
/teacher/login.do

//一般用在过滤器中,这个会拦截该web应用中所有的请求都会通过该过滤器
//比如http://localhost:8888/test/login.jsp http://localhost:8888/test/hello.html http://localhost:8888/test/hello.jpg

/*

//只是拦截所有后缀是.do的请求
//只要后缀不是.do的请求的都不会拦截
*.do

/*.do //这样写是错误的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值