一.概念:什么是Servlet
servlet是一个java程序,是在服务器上运行以处理客户端请求并作出响应的程序
二.小结:
- web.xml中的加载顺序:与文件当中的排列顺序无关:
- context-param(配置节)-->listener(监听器)-->filter(过滤器)-->servlet
1.本质:获取前端的请求以及携带的数据,并将其传递给service层,将service层处理完请求之后的结果返还给web层
2.配置:两种方式
2.1:注解方式:@WebServlet("/请求名"),请求名要与jsp里面的请求名一一对应
eg:@WebServlet("/login") ---->一定记得括号里面写双引号
2.2:配置web.xml文件:(下面为方法:名字一一对应,请求名映射到具体类路径)
<!-- 配置servlet的访问路径,知道访问的是哪一个servlet-->
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>com.web.servlet.Login</servlet-class>
</servlet>
<!--配置映射-->
<servlet-mapping>
<servlet-name>Login</servlet-name>
<!--servlet的访问路径,三种配置方式:
1.完全匹配 /hello
2.目录匹配
3.扩展名匹配 *.do
(一定不能混用)
-->
<url-pattern>/login</url-pattern>
</servlet-mapping>
3.功能:
3.1:接收jsp传过来的请求及数据,创建serviceImp的对象来实现具体的业务处理
3.2:存取值方式:用什么存,就用什么取
3.2.1:request.setAttribute("存放的变量的名字",要存放的变量);
3.2.2:session.setAttribute("存放的变量的名字",要存放的变量);
3.2.2.1:不是servlet里面的内置对象,使用前需要先创建,jsp当中不需要(因为是jsp中九大内置对象之一)
HttpSession session = request.getSession();
3.3:将处理完的请求结果返还到jsp
3.4:转到jsp的两种方式
3.4.1:请求转发:req.getRequestDispatcher("跳转的jsp路径").forward(req,resp);//携带数据将请求转发,实际上还是在原有页面,只不过数据带到了另一个页面
3.4.2:重定向:resp.sendRedirect("main.jsp");//不携带数据跳转
4.注意事项:
4.1:注意设置编码:
req.setCharacterEncoding("UTF-8");
//设置从前端传到后台的字符编码,全大写或者全小写,防止中文乱码,出现问号?-->设置请求编码
4.2:作用域大小:page<request<session<application
page:当前页面
request:一次请求
session:一次会话
application:服务器启动到停止
三.servlet是替代了原先的do xxx.jsp
- <load-on-startup>
指定当Web应用启动时,装载Servlet的次序。当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet。当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它 - <servlet-mapping>
用来定义servlet所对应的URL,包含两个子元素 - <servlet-name>
指定servlet的名称 - <url-pattern>
指定servlet所对应的URL - url-pattern匹配规则,按照优先级从高到低排列
- 精确匹配:类似于/myServlet的精确路径
- 通配符匹配:/*
- 扩展名匹配:*.html,*.jpg ,.do ,.action之类的
- 默认匹配(/)——当之前匹配都不成功时
- 另一方面,<servlet-mapping>并不是必须的
三.步骤:
- 创建maven项目,导入依赖
- 创建webapp/WEB-INF目录,在项目管理里面新增xml文件
- 用jsp写页面,然后通过javaScript里面的方法去传递参数给action,然后通过action里面的servlet名称去匹配web.xml文件里面的servlet,判断执行哪个servlet,并根据携带的参数判断具体执行哪个方法
- servlet 继承 HttpServlet,要重写doGet和doPost这两个方法
- 为了两种提交方式都能执行,一般在doPost方法里面,调用doGet方法,然后具体三部曲都写在doGet里面,这样不论通过哪种方式提交,都能完成相应的功能
- 在servlet里面调用业务层的方法去执行相应的功能,并将执行的结果通过转发或者重定向的方式反馈给页面
- 通过servlet,可以减少很多doxxx.jsp的页面,这样只需要给每一个类建一个servet,然后将每一个类具体对业务层的方法的调用以及对view层的数据反馈全部集成到一个servlet类里面,这样会使得代码更简洁,更规范。
四.Servlet生命周期
- 实例化(一次):servlet容器创建servlet对象。默认创建servlet实例的时机:当我们发送servlet对应的请求时(在使用时创建)。类似单例模式中的懒加载方式。希望容器一旦启动,就自动创建servlet实例通过load-on-startup=1设置,正数数值越低优先级别越高,优先实例化
- 初始化(一次):servlet实例一旦创建,就开始初始化一些参数配置,我们可以做一些参数配置,比如编码,可以在web.xml或注解中配置
- 就绪状态(get,post服务多次):当发送对应的servlet请求时,会调用service()方法,注意此时不会重新创建servlet实例,也不会调用init()方法
- 销毁状态(多次):调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除处理