servlet使用详解

上一篇对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

注:在 actiontestServlet 代表在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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值