• javaWEB中的ServletRequest,ServletResponse的使用,及简化Servlet方法


    首先说一下ServletRequest,ServletResponse类的使用方法:

    public void service(ServletRequest request, ServletResponse response)
    throws ServletException, IOException {
    /*
    * 如何在Servlet中获取请求信息:
    * (1):Servlet的servlet()方法用于应答请求:因为每次请求都会调用servlet()方法;
    * ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
    * ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.
    * 这两个接口的实现类都是服务器给予实现的, 并在服务器调用 service 方法时传入.
    *
    * ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
    * */
    System.out.println("请求来了");
    System.out.println(request);
    System.out.println(response);

    // 获取请求参数: String getParameter(String name): 根据请求参数的名字, 返回参数值.
    //若请求参数有多个值(例如 checkbox), 该方法只能获取到第一个提交的值.

    //获取login.html中的user和password
    String user=request.getParameter("user");
    String password=request.getParameter("password");

    System.out.println(user+"---"+password);

    //String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组.

    //获取login.html中复选框的多个值,其中复选框中的name值是相等
    String inte=request.getParameter("interesting");
    System.out.println(inte);
    String[] interestings=request.getParameterValues("interesting");
    for(String inter:interestings){
    System.out.println("--->"+inter);
    }

    //Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,
    //类似于 ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.
    Enumeration<String> names=request.getParameterNames();
    while(names.hasMoreElements()){
    String name=names.nextElement();
    String value=request.getParameter(name);

    System.out.println("name:"+name+"---"+"value:"+value);
    }

    //Map getParameterMap(): 返回请求参数的键值对: key: 参数名, value: 参数值, String 数组类型.
    //此方法可以把key值相同的所有value值放在一起输出
    Map<String, String[]> map=request.getParameterMap();
    for(Map.Entry<String, String[]> entry:map.entrySet()){
    System.out.println(entry.getKey()+"《---》"+Arrays.asList(entry.getValue()));
    }

    //HttpServletRequest是ServletRequest的子接口,
    //针对于 HTTP 请求所定义. 里边包含了大量获取 HTTP 请求相关的方法.
    HttpServletRequest http=(HttpServletRequest) request;

    //获取请求的URL,
    String requestUrl=http.getRequestURI();
    System.out.println(requestUrl);

    //获取请求方式:即两种请求方式post和get
    String method=http.getMethod();
    System.out.println(method);

    //获取请求的 Serlvet 的映射路径
    String servletPath = http.getServletPath();
    System.out.println(servletPath); // /loginServlet

    //获取请求的查询字符串get请求?后面的字符串
    String queryString=http.getQueryString();
    System.out.println(queryString);



    //ServletResponse封装了响应信息,如果想给用户什么响应, 具体可以使用该接口的方法实现
    //不用看控制台,直接在页面上让用户就可以看到

    //设置相应类型,例如word文档
    response.setContentType("application/msword");//application/msword是word文档

    //getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印到客户的浏览器上.
    PrintWriter out=response.getWriter();

    String user1=getServletContext().getInitParameter("user");
    String password1=getServletContext().getInitParameter("password");
    System.out.println("user1:"+user1+"---"+"password1"+password1);
    if(user.equals(user1) && password.equals(password1)){
    out.println("helloworld...");
    }


    //void sendRedirect(String location): 请求的重定向. (此方法为 HttpServletResponse 中定义.)


    }

    ----------------------------------------------------------------------------------------------------

    将继承Servlet接口的类简化:将这个类改造成一个抽象方法,然后让其他子类来继承这个抽象的父类

    改在的抽象类:MyGenericServlet

    /*
    * 自定一个servlet接口的实现类:让开发任何Servlet都继承该类,以简化开发
    * 将其定义为一个抽象类,里面有一个抽象方法
    * */
    public abstract class MyGenericServlet implements Servlet,ServletConfig{
    //这些是Servlet接口的方法
    @Override
    public void destroy() {}

    @Override
    public ServletConfig getServletConfig() {
    return servletConfig;
    }

    public void init() throws ServletException {
    // TODO Auto-generated method stub

    }

    @Override
    public String getServletInfo() {
    return null;
    }

    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    this.servletConfig=servletConfig;

    }

    //这个方法必须实现,所以弄成抽象的方法
    @Override
    public abstract void service(ServletRequest arg0, ServletResponse arg1)
    throws ServletException, IOException;


    //一下是,ServletConfig接口的方法:
    @Override
    public String getInitParameter(String arg0) {
    return servletConfig.getInitParameter(arg0);
    }

    @Override
    public Enumeration getInitParameterNames() {
    return servletConfig.getInitParameterNames();
    }

    @Override
    public ServletContext getServletContext() {
    return servletConfig.getServletContext();
    }

    @Override
    public String getServletName() {
    return servletConfig.getServletName();
    }

    }

    -----------------------

    子类继承抽象的父类:

    public class LoginServlet extends MyGenericServlet{

    //对当前的Servlet初始化:覆盖init方法
    @Override
    public void init() throws ServletException{
    System.out.println("初始化>>>>");
    }
    @Override
    public void service(ServletRequest request, ServletResponse response)
    throws ServletException, IOException {
    /*
    * 如何在Servlet中获取请求信息:
    * (1):Servlet的servlet()方法用于应答请求:因为每次请求都会调用servlet()方法;
    * ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
    * ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.
    * 这两个接口的实现类都是服务器给予实现的, 并在服务器调用 service 方法时传入.
    *
    * ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
    * */
    System.out.println("请求来了");
    System.out.println(request);
    System.out.println(response);

    // 获取请求参数: String getParameter(String name): 根据请求参数的名字, 返回参数值.
    //若请求参数有多个值(例如 checkbox), 该方法只能获取到第一个提交的值.

    //获取login.html中的user和password
    String user=request.getParameter("user");
    String password=request.getParameter("password");

    System.out.println(user+"---"+password);

    //String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组.

    //获取login.html中复选框的多个值,其中复选框中的name值是相等
    String inte=request.getParameter("interesting");
    System.out.println(inte);
    String[] interestings=request.getParameterValues("interesting");
    for(String inter:interestings){
    System.out.println("--->"+inter);
    }

    //Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,
    //类似于 ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.
    Enumeration<String> names=request.getParameterNames();
    while(names.hasMoreElements()){
    String name=names.nextElement();
    String value=request.getParameter(name);

    System.out.println("name:"+name+"---"+"value:"+value);
    }

    //Map getParameterMap(): 返回请求参数的键值对: key: 参数名, value: 参数值, String 数组类型.
    //此方法可以把key值相同的所有value值放在一起输出
    Map<String, String[]> map=request.getParameterMap();
    for(Map.Entry<String, String[]> entry:map.entrySet()){
    System.out.println(entry.getKey()+"《---》"+Arrays.asList(entry.getValue()));
    }

    //HttpServletRequest是ServletRequest的子接口,
    //针对于 HTTP 请求所定义. 里边包含了大量获取 HTTP 请求相关的方法.
    HttpServletRequest http=(HttpServletRequest) request;

    //获取请求的URL,
    String requestUrl=http.getRequestURI();
    System.out.println(requestUrl);

    //获取请求方式:即两种请求方式post和get
    String method=http.getMethod();
    System.out.println(method);

    //获取请求的 Serlvet 的映射路径
    String servletPath = http.getServletPath();
    System.out.println(servletPath); // /loginServlet

    //获取请求的查询字符串get请求?后面的字符串
    String queryString=http.getQueryString();
    System.out.println(queryString);



    //ServletResponse封装了响应信息,如果想给用户什么响应, 具体可以使用该接口的方法实现
    //不用看控制台,直接在页面上让用户就可以看到

    //设置相应类型,例如word文档
    response.setContentType("application/msword");//application/msword是word文档

    //getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印到客户的浏览器上.
    PrintWriter out=response.getWriter();

    String user1=getServletContext().getInitParameter("user");
    String password1=getServletContext().getInitParameter("password");
    System.out.println("user1:"+user1+"---"+"password1"+password1);
    if(user.equals(user1) && password.equals(password1)){
    out.println("helloworld...");
    }


    //void sendRedirect(String location): 请求的重定向. (此方法为 HttpServletResponse 中定义.)


    }

    }

    -----------------------------------------------------------------------------------------------

    上面的抽象类正好是GenericServlet抽象类,及子类直接继承GenericServletc抽象类即可;

    其中GenericServlet,是一个Servlet。是Servlet接口和ServletConfig接口的实现类,但是一个抽象类。其中Servlet方法为抽象方法。

    如果新建的Servlet类直接继承GenericServlet抽象类,是开发更加简便;

    具体实现:

    ①. 在 GenericServlet 中声明了一个 SerlvetConfig 类型的成员变量, 在 init(ServletConfig) 方法中对其进行了初始化
    ②. 利用 servletConfig 成员变量的方法实现了 ServletConfig 接口的方法
    ③. 还定义了一个 init() 方法, 在 init(SerlvetConfig) 方法中对其进行调用, 子类可以直接覆盖 init() 在其中实现对 Servlet 的初始化.
    ④. 不建议直接覆盖 init(ServletConfig), 因为如果忘记编写 super.init(config); 而还是用了 SerlvetConfig 接口的方法,
    则会出现空指针异常.
    ⑤. 新建的 init(){} 并非 Serlvet 的生命周期方法. 而 init(ServletConfig) 是生命周期相关的方法.

    public class LoginServlet extends GenericServlet{

    //对当前的Servlet初始化:覆盖init方法
    @Override
    public void init() throws ServletException{
    System.out.println("初始化>>>>");
    }
    @Override
    public void service(ServletRequest request, ServletResponse response)
    throws ServletException, IOException {
    /*
    * 如何在Servlet中获取请求信息:
    * (1):Servlet的servlet()方法用于应答请求:因为每次请求都会调用servlet()方法;
    * ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
    * ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.
    * 这两个接口的实现类都是服务器给予实现的, 并在服务器调用 service 方法时传入.
    *
    * ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
    * */
    System.out.println("请求来了");
    System.out.println(request);
    System.out.println(response);

    // 获取请求参数: String getParameter(String name): 根据请求参数的名字, 返回参数值.
    //若请求参数有多个值(例如 checkbox), 该方法只能获取到第一个提交的值.

    //获取login.html中的user和password
    String user=request.getParameter("user");
    String password=request.getParameter("password");

    System.out.println(user+"---"+password);

    //String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组.

    //获取login.html中复选框的多个值,其中复选框中的name值是相等
    String inte=request.getParameter("interesting");
    System.out.println(inte);
    String[] interestings=request.getParameterValues("interesting");
    for(String inter:interestings){
    System.out.println("--->"+inter);
    }

    //Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,
    //类似于 ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.
    Enumeration<String> names=request.getParameterNames();
    while(names.hasMoreElements()){
    String name=names.nextElement();
    String value=request.getParameter(name);

    System.out.println("name:"+name+"---"+"value:"+value);
    }

    //Map getParameterMap(): 返回请求参数的键值对: key: 参数名, value: 参数值, String 数组类型.
    //此方法可以把key值相同的所有value值放在一起输出
    Map<String, String[]> map=request.getParameterMap();
    for(Map.Entry<String, String[]> entry:map.entrySet()){
    System.out.println(entry.getKey()+"《---》"+Arrays.asList(entry.getValue()));
    }

    //HttpServletRequest是ServletRequest的子接口,
    //针对于 HTTP 请求所定义. 里边包含了大量获取 HTTP 请求相关的方法.
    HttpServletRequest http=(HttpServletRequest) request;

    //获取请求的URL,
    String requestUrl=http.getRequestURI();
    System.out.println(requestUrl);

    //获取请求方式:即两种请求方式post和get
    String method=http.getMethod();
    System.out.println(method);

    //获取请求的 Serlvet 的映射路径
    String servletPath = http.getServletPath();
    System.out.println(servletPath); // /loginServlet

    //获取请求的查询字符串get请求?后面的字符串
    String queryString=http.getQueryString();
    System.out.println(queryString);



    //ServletResponse封装了响应信息,如果想给用户什么响应, 具体可以使用该接口的方法实现
    //不用看控制台,直接在页面上让用户就可以看到

    //设置相应类型,例如word文档
    response.setContentType("application/msword");//application/msword是word文档

    //getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印到客户的浏览器上.
    PrintWriter out=response.getWriter();

    String user1=getServletContext().getInitParameter("user");
    String password1=getServletContext().getInitParameter("password");
    System.out.println("user1:"+user1+"---"+"password1"+password1);
    if(user.equals(user1) && password.equals(password1)){
    out.println("helloworld...");
    }


    //void sendRedirect(String location): 请求的重定向. (此方法为 HttpServletResponse 中定义.)


    }

    }

  • 相关阅读:
    CAP 与数据一致性
    C++的构造函数为何不能为虚函数
    构造函数和析构函数中可以调用调用虚函数吗
    HTTP状态码
    C++ 单例模式实现
    【转】十大经典排序算法
    C++ short/int/long/long long 等数据类型大小
    块/文件/对象三种存储的优缺点
    罗振宇《时间的朋友》2019-2020
    Google Hacking
  • 原文地址:https://www.cnblogs.com/lxnlxn/p/5811210.html
Copyright © 2020-2023  润新知