Servlet学习笔记

Posted macrazds

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet学习笔记相关的知识,希望对你有一定的参考价值。

Servlet介绍:

  在JAVA WEB中,jsp的本质即是Servlet。Web容器中的jsp页面最终会将其编译成对应的Servlet。但为什么不直接使用Servlet呢?其原因大致有两个:

    1. 开发效率低。特别是生存表现层页面时(即html页面),所有HTML标签都要使用out.println();来输出,这就足以看出其麻烦的程度。

    2. 非程序员(页面的美术设计人员)一般难以参与Servlet页面的开发,因为Servlet是标准java类。

  在写Servlet类的时候,必须继承HttpServlet。HttpServlet中提供了不同的方法用于响应客户端的请求:

    1. doGet   用于响应GET请求

    2. doPost    用于响应POST请求

    3. doPut   用于响应PUT请求

    4. doDelete   用于响应DELETE请求

    5. doOptions 用于处理OPTIONS请求

    6. doTrace  用于处理TRACE请求

  当客户端发出相应请求时,就会调用响应的方法。而要注意的是,在写Servlet类的时候,需要重新定义这些方法,以能够作对应处理。当然,除此之外还有另外的方法:

    1. service   用于判断客户端的请求类型,并调用相应的处理方法(若所有请求的处理是相同的,可直接重写这个方法)

    2. getAllDeclaredMethods 获取指定类的所有方法

    3. maybeSetLastModified 暂时不知道干嘛的

    4. init    用于创建Servlet实例时,初始化Servlet资源

    5. destroy  用于销毁Servlet实例时,回收资源

    ......

 

配置Servlet:

  有两种配置Servlet的方式:

    1. 在Servlet中用@WebServlet来配置(红色代码部分)

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintStream;
@WebServlet(name="firstServlet",urlPatterns = {"/firstServlet"})
public class FirstServlet extends HttpServlet{
    public void init() throws ServletException{
        System.out.println("collected successful!");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,java.io.IOException{
        request.setCharacterEncoding("GBK");
        response.setContentType("text/html;charSet=GBK");
        String num=request.getParameter("number");
        //request.setAttribute("res",num);
        PrintStream out=new PrintStream(response.getOutputStream());
        out.println("<html>");
        out.println("<head>");
        out.println("<title>firstServlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("res: "+(Integer.valueOf(num)*Integer.valueOf(num)));
        out.println("</body>");
        out.println("</html>");
    }
}

    2. 在web.xml中配置(红色代码部分)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1">
    <servlet>
        <servlet-name>firstServlet</servlet-name>
        <servlet-class>FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>firstServlet</servlet-name>
        <url-pattern>/firstServlet</url-pattern>
    </servlet-mapping>
</web-app>

   注:若在Servlet类的定义中及web.xml中均配置了不同的url,则以web.xml的为准

 

Servlet的生命周期:

  有两种创建Servlet实例的情况:

    1. 客户端首次请求某个Servlet时,系统会创建对应实例(大部分如此)

    2. Web应用启动时,即刻创建(load-on-startup Servlet)

  从Servlet创建实例到实例销毁的过程如下:

    1. 创建实例

    2. 初始化(调用init()方法)

    3. 响应客户端请求(调用Servlet()方法)

    4. 资源回收(调用destroy()方法)

    5. 实例销毁

 

load-on-startup Servlet:

  在上面已经说过,有两种创建Servlet实例的情况,而load-on-startup则是对应Web应用启动时即刻创建的情况。这种创建方式既可以在定义Servlet时,用@WebServlet来设定,也可在web.xml中设定。

  load-on-startup可以看成一个优先值,数值越小,表示该Servlet实例创建的就越优先。

  方式1: 在@WebServlet中设定

@WebServlet(loadOnStartup=1)

  方式2: 在web.xml中设定

<servlet>
    <servlet-name>firstServlet</servlet-name>
    <servlet-class>FirstServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

 

Servlet额外参数的配置和访问:

  同样的,在Servlet中配置额外的参数也有两种方式:

    方式1: 在@WebServlet中配置

@WebServlet(name="firstServlet",urlPatterns = {"/firstServlet"},initParams = {
        @WebInitParam(name="Username",value="Macrazds"),
        @WebInitParam(name="Password",value="abcd123")
})

    方式2: 在web.xml中设定

<servlet>
    <servlet-name>firstServlet</servlet-name>
    <servlet-class>FirstServlet</servlet-class>
    <init-param>
        <param-name>Username</param-name>
        <param-value>Macrazds</param-value>
    </init-param>
    <init-param>
        <param-name>Password</param-name>
        <param-value>abcd123</param-value>
    </init-param>
</servlet>

    在Servlet中访问额外参数的指令:

public class FirstServlet extends HttpServlet{
    public void init(ServletConfig config) throws ServletException{
        super.init(config);
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,java.io.IOException{
    //获取ServletConfig对象 ServletConfig config
=getServletConfig();
   
 //获取名为Username的额外参数的值 String username=config.getInitParameter("Username"
); } }

 

Servlet作为控制器:

  在这里先简略介绍一下MVC模式。MVC其实是三个部分的简称,即Model(模型)、View(视图)、Controller(控制器)。

  在标准的MVC模式中,Servlet是仅作为控制器使用的,而JSP页面是作为视图,模型则是对应的JavaBean。

  各部分的具体意义如下:

    Model:指业务的规则(模型)。

    View:指用户所见的可视交互界面。

    Controller:作用是接收到来自View的数据后,进行对应请求的响应,并调用相关Model完成用户需求。

  MVC具体的过程如下:

用户从View输入相关数据 / 发出业务请求

V

Controller接收业务请求,并将数据传到相关Model完成业务请求

V

Controller根据Model的处理结果选择不同的View

V

用户从跳转的View获得对应的反馈信息,并进行下一步操作

 

以上是关于Servlet学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Servlet学习笔记

JAVAWEB学习笔记13_servlet

JavaWeb学习笔记-05初识servlet

jsp/servlet学习笔记(核心编程)servlet部分

JSP九大内置对象与Servlet学习笔记[转]

Servlet学习笔记02