• java Servlet


    java servlet,运行在web容器(比如tomcat,就是一个Web应用服务器,是一个Servlet容器)中运行的java应用程序,处理请求HttpServletRequest和发送响应HttpServletResponse,即处理用户在B端(浏览器端)发出的请求到S端(服务器端),服务器端把处理的结果发送响应到B端。

    一、servlet简单配置和使用

      编写servlet.java

    package com.cn.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @author cfang
     * 2018年5月29日 下午4:49:37
     * 
     * 生命周期 :web容器反射实例化newInstance -> 初始化init -> service方法分发 -> doGet/doPost -> 销毁destroy
     */
    public class MyServlet extends HttpServlet{
        
        public MyServlet(){
            System.out.println("实例化MyServlet");
        }
        
        @Override
        public void init() throws ServletException {
            System.out.println("init");
            super.init();
        }
        /**
         * 请求统一转发器,功能类似springmvc的dispatchservlet
         * 接收所有请求,然后根据post、get请求,分发到具体的doGet或者doPost方法上。
         * HttpServlet中具体实现,根据req.getMethod()获取请求方法,再比较是GET还是POST。
         */
        @Override
        protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
                throws ServletException, IOException {
            //to do something。。。
            
            //交给父类方法处理分发
            super.service(arg0, arg1);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
                throws ServletException, IOException {
            System.out.println("doGet");
        }
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("doPost");
        }
        
        /**
         * servlet销毁触发
         */
        @Override
        public void destroy() {
            System.out.println("destroy servlet");
            super.destroy();
        }
    }

      配置web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">
    
        <!-- servlet配置 -->
        <servlet>
            <!-- servlet别名,随便取,一般取跟类名相同 -->
            <servlet-name>myServlet</servlet-name>
            <!-- 将类的实例化操作交给web服务器(如tomcat)去实现 -->
            <!-- web容器去反射实例化servlet, Class.forName("com.cn.servlet.MyServlet").newInstance() -->
            <servlet-class>com.cn.servlet.MyServlet</servlet-class>
            <init-param>
                <!-- 这里可以放置初始化参数 -->
                <param-name>test</param-name>
                <param-value>test init param</param-value>
            </init-param>
            <!-- 标记是否在容器启动的时候,加载这个servlet -->
            <!-- 当 大于等于0的时候,表示容器启动时就加载并初始化servlet。正数的值越小,优先级越高,应用启动时优先加载-->
            <!-- 当未设置或者负数的时候,则是在第一次调用该servlet的时候才去加载 -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <!-- 和上面定义的servlet-name一致 -->
            <servlet-name>myServlet</servlet-name>
            <!-- servlet拦截路径,也就是浏览器通过这个配置的url规则找到对应处理的servlet -->
            <!-- "/"表示拦截所有请求, "/xxx"表示只拦截xxx的请求 -->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        
        
    </web-app>

    二、servlet生命周期

      web服务器启动时,根据配置的load-on-startup信息,决定是否加载或者是在第一次调用的时候再加载,初始化。

      接收处理请求,执行service方法,分发请求到具体doGet/doPost中处理并返回客户端数据。

      服务器关闭,销毁servlet对象,执行destroy方法。

    三、几个重点对象

      1、ServletConfig

         获取 : getServletConfig()

         方法说明:  getServletName();  //获取servlet的名称,也就是我们在web.xml中配置的servlet-name

              getServletContext; //获取ServletContext对象,该对象的作用看 2 中

              getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数

              getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型

      2、ServletContext

        获取:getServletContext()、getServletConfig().getServletContext();

        方法说明:一个web容器中,每个项目中,ServletContext实例只会有一份。

             存放、共享数据:Object getAttribute(String name)、void setAttribute(String name, Object object)、void removeAttribute(String name)。

             获取初始化参数:String getInitParameter(String name)、Enumeration getInitParameterNames()

             获取web项目指定资源路径:String getRealPath(String path),会输出绝对路径。

      3、request/response

        3.1、request能获得请求文本中的所有内容:请求头、请求体、请求行 。还可请求的转发request.getRequestDispatcher(String path).forward(request,response);

            path:转发后跳转的页面,这里不管用不用"/"开头,都是以web项目根开始,因为这是请求转发,请求转发只局限与在同一个web项目下使用,

            所以这里一直都是从web项目根下开始的。

        3.2、response

            response.setHeader(java.lang.String name, java.lang.String value)设置头信息

            手动重定向:

              response.setStatus(302);  //状态码302就代表重定向

              response.setHeader("location","http://www.baidu.com");

            封装的方法:

              response.sendRedirect("http://www.baidu.com");

              特点:服务器告诉浏览器要跳转的页面,浏览器主动去跳转的页面,浏览器的地址栏中url会变,

                    是浏览器重新发起一个请求到另外一个页面,所以request是重新发起的,跟请求转发不一样。

                注意:response.sendRedirect(path);  //

                第一种:response.sendRedirect("/test01/MyServlet01");  //使用了"/"开头,说明是从web站点根开始,所以需要写test01/MyServlet01

                第二种:response.sendRedirect("MyServlet01");  //没有使用"/"开头,说明是从web项目根开始,那么就无需写test01了。

                重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用"/"区分开来,如果使用了"/"开头,

                就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,如果没有使用"/"开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。

    下篇继续解决request、response的中文乱码问题。。

  • 相关阅读:
    grant授权“失败”的原因
    解决:error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'
    3.MySQL之创建/删除用户
    Linux常用宏contianer_of()
    Linux设备模型(一)_基本概念
    内核探测工具systemtap简介
    模块驱动调试记录 ——platform_driver_register
    Linux软件栈上的性能诊断工具集
    系统调用—sysconf
    C的编译&预编译
  • 原文地址:https://www.cnblogs.com/eric-fang/p/9106469.html
Copyright © 2020-2023  润新知