上一篇对servlet原理以及源码进行了叙述,如果不明白请看 servlet简介
Servlet生命周期
Servlet生命周期:
初始化:Web容器加载servlet,调用init()方法
处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。
销毁:服务结束,web容器会调用servlet的distroy()方法销毁servlet。
get提交和post提交有何区别
1.get是从服务器上获取资源,post是向服务器传送资源;
2.get可以在URL上看到参数(一般拼接到url后面),post则看不到;
3.get传送的数据量比较小,post比较大;
4.get安全性低,post安全性高;
5.对get,服务器用Request.QueryString获取变量的值;对于post,服务器端用Request.Form获取提交的数据;
建议:
1.包含机密信息的话用post提交;
2.数据查询用get,数据添加修改下载或者删除时用post。
request.getParameter和request.getAttribute
相同点
1.都是HttpServletRequest类中的方法
2.都是用来传递数据用的
区别:
getParameter 是用来接受用post和get方法传递过来的参数的.
getAttribute 必须先setAttribute.
request.getParameter() 取得是通过容器的实现来取得通过类似post,get等方式传入的数据,request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。
request.getParameter() 方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据,getAttribute 返回Object数据类型
request.setAttribute() 和 getAttribute() 方法传递的数据只会存在于Web容器内部
HttpServletRequest 类有 setAttribute() 方法,而没有setParameter() 方法
三大应用之servlet
基本使用:
1、首先定义一个servlet:
public class testServlet extends HttpServlet {
//执行post请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
//执行get请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
2、在web.xml注册servlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>Java.testServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>
</web-app>
使用:
<form action="testServlet" method="get"></form>
过程:
首先通过 action="testServlet"` 在web.xml查找 url-pattern为`“/testServlet”` 对应的servlet-name
其次通过servlet-nam找到servlet-class
最后通过servlet-class对应的类,通过service() 判断执行dopost还是doget
注:在 action
里 testServlet
代表在url对应的目录下查找。加 /
表示在根资源目录下查找
注解形式:
Servlet3.0介绍:ava EE6规范的一部分,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。
支持环境:
JDK:JDK 1.6+
tomcat:tomcat 7+
Servlet核⼼注解: @WebServlet(“urlPattern”)
注解开发
@WebServlet(name = "wqeqServlet" ,urlPatterns = "/wqeqServlet")
public class wqeqServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
@WebServlet注解属性
上述 @WebServlet(“”)
就等价于@WebServlet(name = "" ,urlPatterns = "")
,下面是一些属性介绍
中文乱码问题
在整个Servlet访问过程中牵扯到 浏览器,Tomcat,Java程序三者
浏览器默认编码方式:gbk,
Tomcat默认编码:iso-8859-1 ,
java代码中的编码一般常用utf-8
在servlet里进行请求交互时,中文乱码是经常见的问题,一下是一些设置方法:
1、请求中文乱码的处理:
request.setCharacterEncoding("UTF-8");
2、响应中文乱码的处理:
response.setContentType(“text/html;charset=UTF-8”);
转发与重定向
转发的特点
地址栏不发生变化,显示的是上一个页面的地址
请求次数:只有1次请求
根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
请求域中数据不会丢失
在servlet的调用方法
request.getRequestDispatcher("/地址").forward(request, response);
重定向的特点
地址栏:显示新的地址
请求次数:2次
根目录:http://localhost:8080/ 没有项目的名字
请求域中的数据会丢失,因为是2次请求
在servlet的掉用方法
response.sendRedirect("/地址");
重定向与转发的区别:
1.重定向访问服务器两次,转发只访问服务器一次。
2.重定向可以看见目标页面的URL,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的。
3.重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了。
4.在request级别使用信息共享,使用重定向必然出错
5.重定向可以访问自己web应用以外的资源
应用场景
如果要保留请求域中的数据,使用转发,否则使用重定向。
访问数据库,增删改使用重定向,查询使用转发。
三大应用之过滤器
1过滤器的概念:
过滤器(Filter)是javaEEServlet模块下的组件
过滤器的作⽤是对URL进⾏统⼀的拦截处理
通常⽤于应⽤程序层⾯进⾏全局处理,例如字符编码,身份认证等等
原理:
应用场景:
1、 解决编码问题: request.setCharacterEncoding("utf-8");
2、 用于验证用户是否登录成功代码:
servlet接口
public interface Filter {
//初始化
default void init(FilterConfig filterConfig) throws ServletException {
}
//执行过滤器
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
//销毁
default void destroy() {
}
}
过滤器生命周期
1). init方法:
服务器启动的时候创建过滤器对象,创建一次,调用init方法
在创建完过滤器对象之后被调用。只执行一次
注:过滤器在Web服务器中也是单例模式
2). doFilter方法:
执行过滤任务方法。执行多次。
3). destroy方法:
Web服务器停止或者Web应用重新加载,销毁过滤器对象。
过滤器在Web服务器启动的时候就加载了,因为要拦截Web资源,所以必须在所有Web资源启动之前就加载过滤器。
过滤器的过滤类型:
REQUEST、FORWARD、INCLUDE、ERROR
使用方法:
Filter
public class Filter implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
web.xml
<!-- 过滤器的配置 -->
<filter>
<!-- 过滤器的内部名字 -->
<filter-name>Filter</filter-name>
<filter-class>org.newboy.filter.Filter</filter-class>
</filter>
<!-- 映射路径 -->
<filter-mapping>
<filter-name>Filter</filter-name>
<!-- 过滤的Web资源路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
URLPattern
l. 以’/’开头和以”/*”结尾的是用来做路径映射的。
2. 以前缀”*.”开头的是用来做扩展映射的。 如:*.jsp
3. “/” 是用来定义default servlet映射的。
4. 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
注解开发
上面可以用下面进行代替:
@WebFilter("Filter")
public class Filter implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
注:过滤器可以设置多个,每个有自己独有的过滤规则,但设置过滤器链的时候不要使用注解开发。
三大应用之监听器
监听器(Listener)的概念:
监听器⽤于监听web对象的创建和销毁。以及⾃身参数的变化(包括:增、删、改)。在事件发⽣后⾃动触发某些代码的执⾏
可监听的对象
可监听的对象包括三种:
ServletContext,针对全局的Context及其属性操作的监听
HttpSession,针对某个⽤户会话及其属性操作的监听
ServletRequest,针对某个请求对象以及属性操作的监听
监听器开发三步⾛
实现XXXXLintener接⼝,不同接⼝对应不同监听对象
实现接⼝中⽅法,编写触发后的操作逻辑
在web.xml中配置监听器,使其⽣效
常⻅的监听接⼝
⽤于对象的创建和销毁进⾏监听:
ServletContextListener- 监听ServletContext对象创建、销毁等操作
HttpSessionListener- 监听HttpSession对象创建、销毁等操作
ServletRequestListener- 监听ServletRequest对象创建、销毁等操作
⽤于 对象的属性设置和修改 进⾏监听:
ServletContextAttributeListener- 监听全局属性操作
HttpSessionAttributeListener- 监听会话属性操作
ServletRequestAttributeListener- 监听请求属性操作
生命周期
何时创建:服务器启动创建
何时销毁:服务器关闭销毁
使⽤场景举例:
⼤量⽤于⽇志⽣成
统计在线⼈数
监听器接口:
ServletCntextListener:应用上下文生命周期的监听器,用于监听web应用的启动销毁事件
ServletContextAttributeListener:应用上下文属性事件监听器,用于监听web应用上下文中的属性改变事件
ServletRequestListener:请求声明周期监听器,用于监听1请求的创建和销毁
ServletRequestAttributeListener:监听请求中国属性改变的事件
HttpSessionListener:会话生命周期监听器,用于监听会话的创建和销毁事件
HttpSessionAttributeListener:监听会话中属性的改变
HttpSessionActivationListener:监听会话的激活和钝化事件
HttpSessionBindingListener:会话值绑定事件监听器,是唯一不需要在web.xml中设定的Listener
在web.xml中添加监听器:
<listener>
<listener-class>监听器全限定名</listener-class>
</listener>