Servlet 学习(二)

Servlet处理请求参数

HttpServletRequest对象提供了获取get、post请求参数的方法 getParamter

  1. Tomcat收到浏览器请求时候
    1. 先解析请求行和请求头,然后将这些信息存储到request对象中。
    2. 执行Servlet可以收到request
  2. 对于Post请求
    1. post请求参数在"请求Body"中传输到服务器
    2. request对象在第一次调用getParamter时候解析请求Body中的参数
    3. request会按照ISO8859-1编码解析post请求参数。
  3. 对于get请求
    1. get请求参数在“请求行”中传递到服务器
    2. tomcat默认按照ISO8859-1编码解析请求行和请求头,并且存储到request对象
    3. getParamter方法执行时候不进行编码解析。

 

Servlet 学习(二)_第1张图片

 

 

 Servlet 学习(二)_第2张图片

 

 

 

获取post请求案例:

  1. 编写客户端页面 login.html





登录页


    

登录

利用Servlet处理请求参数, 表单大多使用post请求

 

2.编写Servlet处理请求

/**
 * 在Servlet中接收表单参数
 */
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, 
            HttpServletResponse response) 
            throws ServletException, IOException {
        /*
         * 用户浏览器发起的 Post 请求被Tomcat接收,
         * Tomcat将请求信息解析到 Request 对象中。
         * 任何请求信息,都可以从Request对象中获取
         * 如获取请求参数:request.getParamter("username")
         *  paramter: 参数
         */
        //setCharacterEncoding通知Request对象
        //在解析 请求Body 时候使用UTF-8编码
        //必须在 getParameter 方法调用之前设置
        request.setCharacterEncoding("UTF-8");

        String name=request.getParameter("username");
        System.out.println("name="+name); 
        String pwd=request.getParameter("pwd");
        System.out.println("pwd="+pwd);  

        response.setContentType(
                "text/html; charset=UTF-8");
        PrintWriter out=response.getWriter();
        out.println("");
        //简易密码验证逻辑
        if(name.equals("tom") && pwd.equals("123")) {
            out.println("

登录成功

"); }else { out.println("

登录失败

"); } out.println(""); } }

 

获取get请求案例:

  1. 编写Servlet

/**
 * 处理get请求参数当浏览器的get请求发送到Tomcat服务器时候,Tomcat会
 * 解析请求头部,将请求头部数据存储到Request对象中传递到 Servlet。在Servlet中可以利用getParamter方法获取get请求参数
 */
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        //获取get请求参数时候,如果key对应的参数不存在就返回null
        //request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        String pwd = request.getParameter("pwd");
        System.out.println("name="+name);
        System.out.println("age="+age);
        System.out.println("pwd="+pwd);

        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("

收到get参数!

"); out.println(""); } }

 

2.测试

http://localhost:8080/Servlet02/test?name=赵子龙&age=18

 

post请求中文编码解析

  1. request对象会在第一次调用getParamter方法时候解析post请求参数。
  2. 在第一次调用getParamter之前设置解析编码就可以解决post请求编码问题。
    • request.setCharacterEncoding("UTF-8");

get请求中文编码解析

  1. Tomcat会在创建request对象之前解析get请求参数,所以设置request的编码对get请求无效。
  2. 修改Tomcat的配置参数,可以解决处理get请求中文编码解析问题。

配置Tomcat7:

 connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

 

读取请求参数值
a.方式一
String request.getParameter(String paranName)
b.方式二
String [] request.getParameterValues(String paramName)
注:当有多个请求参数名相同的时候,使用该方法.

 

Servlet容器如何处理请求资源路径?
比如,在浏览器地址栏输入
http://ip:port/servlet-day04/abc.html
step1.容器会认为访问的是一个Servlet
从web.xml中去查找 是否有匹配的servlet
step2.匹配方式:
方式一:精确匹配
请求地址与url-pattern完全一致.
方式二:通配符匹配
/*
注:*匹配零个或多个字符.
方式三:后缀匹配
*.do
注:匹配所有.do结尾的请求
step3.如果找不到匹配的Servlet,则容器会对应查找对应的文件

让一个Servlet处理多种请求
step1.使用后缀匹配,比如:
*.do
step2.分析请求资源路径,依据请求的不同,进行相应的处理.

 

Servlet的生命周期
1.什么是Servlet的生命周期?
    Servlet容器如何创建Servlet实例,如何对其进行初始化,如何调用其方法来处理请求,以及如何其实例整个过程.即Servlet容器如何管理Servlet

Servlet 学习(二)_第3张图片

 


2.Servlet生命周期分成哪几个阶段?

1)实例化 a.什么时候实例化?

情形一(默认):容器收到请求之后,才会创建。

情形二: 容器启动之后,立即创建。需要配置:

              b.注意:容器在默认情况下,只会创建一个实例。 

Servlet 学习(二)_第4张图片


a.实例化
 I.什么是实例化?
   容器调用Servlet的构造器,创建Servlet对象.
 II.什么时候实例化?
    情形1:容器收到请求之后创建
    情形2:容器启动之后,立即创建(需要相应的配置)
    注:容器只会创建一个实例
b.初始化
I.什么是初始化?

  容器在创建好servlet对象之后,会立即调用该对象的 init()方法。

 

Servlet 学习(二)_第5张图片

 

 


II.init方法
  II1.GenericServlet已经提供了init方法的实现.
     (了解)将容器传递过来的ServletConfig对象保存下来,并且提供了getServletConfig方法,用来获得ServletConfig对象.
  II2.init方法只会执行一次.
  II3.可以override init()方法来扩展自己的初始化处理逻辑.
  II4.初始化参数
c.就绪(调用)
  I.什么是就绪?
   容器调用Servlet对象的service方法处理请求.
 II.service方法
  II1.HttpServlet已经提供了service方法的实现:
  依据请求类型调用相应的方法来处理,比如get请求调用doGet方法,post方法请求调用doPost方法. 可以override doGet和doPost方法 或者也可以override service方法.
d.销毁
 I.什么是销毁?
 当服务器关闭或者当前web应用被移出容器时,服务器会销毁每一个servlet,在销毁servlet之前,会调用它的destory()方法,执行销毁前的逻辑,一般用于释放该servlet占用的资源,如打开的流.
容器在删除Servlet对象之前,会调用该对象的destroy方法.
 II.该方法只会执行一次.

 

Servlet 学习(二)_第6张图片

 

 

 

 

 

生命周期相关的几个接口与类(了解)
1.Servlet接口
init()
service()
destroy()

2.GenericServlet抽象类
实现了Servlet接口(实现了init,destroy方法)

3.HttpServlet抽象类
继承了GenericServlet(实现了service方法)

 

 

重定向
1.什么是重定向?
服务器通知浏览器向一个新的地址发送请求
注:服务器可以发送一个302状态码和一个Location消息头(该消息头的值是一个地址,称之为重定向地址)给浏览器,浏览器收到之后,会立即向重定向地址发送请求.
2.如何重定向
response.sendRedirect(String url).
注:url就是重定向地址
重定向之前,服务器会清空response对象上存放的数据
3.特点
a.重定向地址是任意的
b.重定向之后,浏览器的地址栏会发生变化

 

ServletConfig讲解

1.1、配置Servlet初始化参数

   在Servlet的配置文件web.xml中,可以使用一个或多个标签为servlet配置一些初始化参数。

 
 2     ServletConfigDemo1
 3     class>gacl.servlet.study.ServletConfigDemo1class>
 4     
 5     
 6         name
 7         gacl
 8     
 9      
10         password
11         123
12     
13     
14         charset
15         UTF-8
16     
17 

 

1.2、通过ServletConfig获取Servlet的初始化参数

  当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

例如:

 package gacl.servlet.study;
 2 
 3 import java.io.IOException;
 4 import java.util.Enumeration;
 5 import javax.servlet.ServletConfig;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class ServletConfigDemo1 extends HttpServlet {
12 
13     /**
14      * 定义ServletConfig对象来接收配置的初始化参数
15      */
16     private ServletConfig config;
17     
18     /**
19      * 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,
20      * 会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,
21      * 将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以
22      * 得到当前servlet的初始化参数信息。
23      */
24     @Override
25     public void init(ServletConfig config) throws ServletException {
26         this.config = config;
27     }
28 
29     public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
31         //获取在web.xml中配置的初始化参数
32         String paramVal = this.config.getInitParameter("name");//获取指定的初始化参数
33         response.getWriter().print(paramVal);
34         
35         response.getWriter().print("
"); 36 //获取所有的初始化参数 37 Enumeration e = config.getInitParameterNames(); 38 while(e.hasMoreElements()){ 39 String name = e.nextElement(); 40 String value = config.getInitParameter(name); 41 response.getWriter().print(name + "=" + value + "
"); 42 } 43 } 44 45 public void doPost(HttpServletRequest request, HttpServletResponse response) 46 throws ServletException, IOException { 47 this.doGet(request, response); 48 } 49 50 }

 

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LifeServlet extends HttpServlet{

    public LifeServlet() {
        System.out.println("LifeServlet's constructor");
    }
    
    
    
    
    @Override
    public void init() throws ServletException {
        System.out.println("LifeServlet's init()");
    }




    @Override
    public void destroy() {
        System.out.println("LifeServlet's destroy()");
    }




    public void doGet(HttpServletRequest request,HttpServletResponse response){
        System.out.println("LifeServet's service");
        
        /*
         * 通过继承自GenericServlet的方法获得ServletConfig对象.
         */
        ServletConfig config=getServletConfig();
        /*
         * 读取初始化参数
         */
        String company=config.getInitParameter("company");
        System.out.println("公司:"+company);
    }

    
}

 

运行结果如下:

Servlet 学习(二)_第7张图片

 

 

ServletContext对象

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象

ServletContext的应用

  3.1、多个Servlet通过ServletContext对象实现数据共享

  范例:ServletContextDemo1和ServletContextDemo2通过ServletContext对象实现数据共享

package gacl.servlet.study;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletContext;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 public class ServletContextDemo1 extends HttpServlet {
11 
12     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
14         String data = "xdp_gacl";
15         /**
16          * ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,
17          * 可以通过ServletConfig.getServletContext方法获得ServletContext对象。
18          */
19         ServletContext context = this.getServletConfig().getServletContext();//获得ServletContext对象
20         context.setAttribute("data", data);  //将data存储到ServletContext对象中
21     }
22 
23     public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
25         doGet(request, response);
26     }
27 }

 

package gacl.servlet.study;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletContext;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 public class ServletContextDemo2 extends HttpServlet {
11 
12     public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
14         ServletContext context = this.getServletContext();
15         String data = (String) context.getAttribute("data");//从ServletContext对象中取出数据
16         response.getWriter().print("data="+data);
17     }
18 
19     public void doPost(HttpServletRequest request, HttpServletResponse response)
20             throws ServletException, IOException {
21         doGet(request, response);
22     }
23 }
复制代码

 

先运行ServletContextDemo1,将数据data存储到ServletContext对象中,然后运行ServletContextDemo2就可以从ServletContext对象中取出数据了,这样就实现了数据共享,如下图所示:

Servlet 学习(二)_第8张图片

 

 

获取WEB应用的初始化参数

  在web.xml文件中使用标签配置WEB应用的初始化参数,如下所示:


 2 //java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 4     
 5     
 6     
 7         url
 8         jdbc:mysql://localhost:3306/test
 9     
10 
11     
12         index.jsp
13     
14 

 

获取Web应用的初始化参数,代码如下:

package gacl.servlet.study;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletContext;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 
11 public class ServletContextDemo3 extends HttpServlet {
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
15 
16         ServletContext context = this.getServletContext();
17         //获取整个web站点的初始化参数
18         String contextInitParam = context.getInitParameter("url");
19         response.getWriter().print(contextInitParam);
20     }
21 
22     public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
24         doGet(request, response);
25     }
26 
27 }

 

Servlet 学习(二)_第9张图片

你可能感兴趣的:(Servlet 学习(二))