第八章 Servlet概述

第八章 Servlet概述

主要内容:

了解servlet;

掌握servlet实现;

掌握servlet的生命周期。

servlet概念

         Servlet是运行在服务器端用Java语言编写的应用程序,用来处理B/S架构下客户端请求的。需要运行在容器里面,常见容器有Tomcat

如何实现servlet

前提:新建web项目;必须包含javax.servlet包

  1. 所有的 Servlet必须实现javax.servlet.Servletjavax.Servlet接口;

具体通过扩展这两个类实现:

javax.servlet.GenericServletjavax.GenericServlet 支持所有协议

javax.servlet.HttpServletjavax.HttpServlet 支持http协议

创建servlet:ServletDemo1.java

package com.silvan.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

    /**

     * Constructor of the object.

     */

    public ServletDemo4() {

        super();

    }

    /**

     * Destruction of the servlet. <br>

     */

    public void destroy() {

        super.destroy(); // Just puts "destroy" string in log

        // Put your code here

    }

    /**

     * The doGet method of the servlet. <br>

     *

     * This method is called when a form has its tag value method equals to get.

     *

     * @param request the request send by the client to the server

     * @param response the response send by the server to the client

     * @throws ServletException if an error occurred

     * @throws IOException if an error occurred

     */

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();

        out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");

        out.println("<HTML>");

        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");

        out.println("  <BODY>");

        out.print("    This is ");

        out.print(this.getClass());

        out.println(", using the GET method");

        out.println("  </BODY>");

        out.println("</HTML>");

        out.flush();

        out.close();

    }

    /**

     * The doPost method of the servlet. <br>

     *

     * This method is called when a form has its tag value method equals to post.

     *

     * @param request the request send by the client to the server

     * @param response the response send by the server to the client

     * @throws ServletException if an error occurred

     * @throws IOException if an error occurred

     */

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();

        out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");

        out.println("<HTML>");

        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");

        out.println("  <BODY>");

        out.print("    This is ");

        out.print(this.getClass());

        out.println(", using the POST method");

        out.println("  </BODY>");

        out.println("</HTML>");

        out.flush();

        out.close();

    }

    /**

     * Initialization of the servlet. <br>

     *

     * @throws ServletException if an error occurs

     */

    public void init() throws ServletException {

        // Put your code here

    }

}

  1. 在web.xml里面进行配置,

a)         <servlet>和<servlet-mapping>里面的<servlet-name>值要一致

b)         <servlet-class>表示实际servlet类

c)         <url-pattern>访问地址

d)         <servlet>必须写在<servlet-mapping>前面

<servlet>

    <servlet-name>ServletDemo1</servlet-name>

    <servlet-class>com.silvan.servlet.ServletDemo1</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>ServletDemo1</servlet-name>

    <url-pattern>/ServletDemo1</url-pattern>

</servlet-mapping>

  1. 启动Tomcat服务,通过地址http://localhost:8081/08Servlet/ServletDemo1进行访问,地址中的“/ServletDemo1”是web.xml文件中配置的<url-pattern>值

 servlet的生命周期

         指创建Servlet实例之后其存在的时间以及何时消失;   

a)         Init():在Servlet的生命周期中,仅执行一次init方法,是在服务器装入Servlet时执行的

如果servlet标签里面配置了<load-on-startup>且值不小于0则容器启动的时候调用init方法,否则第一次访问该servlet的时候调用;值越大优先级越高

<servlet>

    <servlet-name>ServletDemo1</servlet-name>

    <servlet-class>com.silvan.servlet.ServletDemo1</servlet-class>

    <load-on-startup>0</load-on-startup>

  </servlet>

b)         Service():可以无限次调用,是servlet的核心,主要业务逻辑块

c)         Destroy():当容器reload的时候或者关闭的时候调用

 整个生命过程:

(1)tomcat服务器创建servlet实例。

(2)tomcat服务器调用init()方法,进行初始化。

(3)用户发出请求,tomcat服务器将用户的请求封装为request对象,并创 建response对象,并当做参数传给Servlet中的service()方法。

(4)tomcat服务器调用service()处理请求,处理完请求,并将响应发送给 浏览器端,浏览器端显示结果。

(5)当用户再次发出对该servlet的请求,重复3和4步骤。

(6)当tomcat服务器检测很长时间都没有对该servlet的请求,或tomcat服     务器要关闭,就会自动的调用destroy()方法完成销毁servlet。

案例:

简单的用户认证

a)         登录页面

public class Login extends HttpServlet {

         public void doGet(HttpServletRequest request, HttpServletResponse response) {

                   try {

                            // 解决中文乱码问题

                            response.setContentType("text/html;charset=gbk");

                            PrintWriter out = response.getWriter();

                            out.println("<html>");

                            out.println("<head><title>登陆页面</title></head>");

                            out.println("<body>");

                            out.println("<h1>登陆页面</h1>");

                            out.println("<form action=logincontrol>");

                            out.println("用户名:<input type=text name=username><br>");

                            out.println("密码:<input type=password name=password><br>");

                            out.println("<input type=submit value=登陆>");

                            out.println("</form>");

                            out.println("</body>");

                            out.println("</html>");

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

         }

}

b)         登录验证

/**

 * 用户校验servlet(掌握1.如何实现用户校验;2.如果进行页面的跳转)

 *

 * @author

 *

 */

public class LoginContrl extends HttpServlet {

         public void doGet(HttpServletRequest request, HttpServletResponse response) {

                   // 获取请求的信息(方法的参数需要与input元素中name属性值相同,否则取不到值)

                   String username = request.getParameter("username");

                   String password = request.getParameter("password");

                   String sex = request.getParameter("sex");

                   try {

                            if (username.equals("admin") && password.equals("123")) {// 合法

                                     // 如果用户名合法,则把用户名放到session里面

                                     HttpSession hs = request.getSession();

                                     // 设置session的生命时间(单位s)

                                     hs.setMaxInactiveInterval(30);

                                     // 向session中放置属性

                                     hs.setAttribute("username", username);

                                     hs.setAttribute("password", password);

                                     // b.通过sendRedirect实现不同页面之间数据的共享

                                     response.sendRedirect("welcome?username=" + username

                                                        + "&password=" + password);

                            } else {// 不合法

                                     // 这个方法的参数是url-pattern里面配置的

                                     response.sendRedirect("login");

                            }

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

         }

}

c)         网站欢迎界面

/**

 * 网站的欢迎页面

 *

 * @author

 *

 */

public class Welcome extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) {

           try {

                    response.setContentType("text/html;charset=gbk");

                    PrintWriter out = response.getWriter();

                    // 获取session

                    HttpSession hs = request.getSession();

                    // 根据session中的属性名获取相应的属性值

                    String usernameSession = (String) hs.getAttribute("username");

                    String passwordSession = (String) hs.getAttribute("password");

                    if (usernameSession != null) {// 如果从session当中能够获取用户名,则可以进入我的网站

                             out.println("欢迎登陆我们的网站!用户名:" + usernameSession + " 密码:"

                                                + passwordSession);

                    } else {// 否则显示空白页面

                    }

           } catch (Exception e) {

                    e.printStackTrace();

           }

}

}

原文地址:https://www.cnblogs.com/zhouyeqin/p/6743517.html