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的中文乱码问题。。

posted @ 2018-05-29 18:32  阿呆很呆非常呆  阅读(174)  评论(0编辑  收藏  举报