servlet

作者: ticktackdong | 来源:发表于2018-04-24 14:38 被阅读0次

    开发Servlet

    Servlet本身不能独立运行,需要在一个web应用中运行,一个web应用是部署在tomcat中的
    所以开发一个servlet需要如下几个步骤

    1.创建web应用项目
         创建一个java project,导入servlet-api.jar
    
    2.编写servlet代码
       public class HelloServlet extends HttpServlet{
                 doGet();//在浏览器输入地址提交数据的方式是GET
             }
    
    3.部署到tomcat中
       1. 配置web.xml(web/WEB-INF/web.xml)
        <?xml version="1.0" encoding="UTF-8"?>
       <web-app>
    
    <servlet>
        <servlet-name>HelloServlet</servlet-name>//两处的name必须一样
        <servlet-class>HelloServlet</servlet-class>//name与class可以不一样,一般写成一样
    </servlet>
    
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>//两处的name必须一样
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
      </web-app>
     2.指定输出目录到classes目录(WEB-INF/classes)
     3.配置tomcat的server.xml 中的<context
    

    获取参数

    1.创建login.html
        <!DOCTYPE html>
          <html>
           <head>
             <meta charset="UTF-8">
             <title>登录页面</title>
          </head>
          <body>
    
              <form action="login" method="post">
              //会提价到login路径(映射到LoginServlet)
              账号: <input type="text" name="name"> <br>
              密码: <input type="password" name="password"> <br>
              <input type="submit" value="登录">
              </form>
         </body>
         </html>
      2.创建LoginServlet,提供doPost(),在方法中通过request.getParamter根据name取出对应的账号密码
      3.映射LoginServlet到路径login
    

    返回响应

        LoginServlet判断账号密码是否正确,
        正确打印success否则打印fail。
        创建相应的html字符串通过 
        response.getWriter.println()发送到浏览器
    

    调用流程

    调用流程.png
    1.首先访问login.html打开一个静态html页面在这个页面中可以通过form以post形式提交数据
    http://127.0.0.1/login.html
    2.form把账号和密码提交到/login路径并附带method="post"
    3.tomcat接收到一个新请求http://127.0.0.1/login
    通过web.xml映射到LoginServlet
    4.Tomcat定位到LoginServlet后发现没有LoginServlet实例存在于是就调用LoginServlet的public无参的构造方法实例化一个对象
    5.Tomcat拿到LoginServlet实例后根据login.html提交的method="post"去调用doPost方法
    6.在doPost方法中通过调用参数request.getParameter()把页面上传递过来的账号和密码信息取出来
    7.根据账号密码是否正确创建不同的html字符串并设置在response对象上
    PrintWriter pw = response.getWriter();
    pw.println(html);
    8.tomcat把html传递给浏览器(HTTP协议)

    service()/doGet()/doPost()

    doGet()
       当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法
        get方式:
              form默认提交方式
              通过超链访问某个地址
              在地址栏输入某个地址
              ajax指定使用get方式的时候
    
    doPost()
           当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法
        post方式:
              form显示设置method="post"时
              ajax指定使用get方式的时候
    
    service()
          实际上在执行doGet/doPost之前都会先执行service(HttpServletRequest , HttpServletResponse ),由service判断调用get还是post
          service(), doGet(), doPost() 三种方式的参数列表都是一样的。
           所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。
    

    中文问题

    获取中文的参数
    方法一:
              1.login.html加上
                  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
                 //告诉浏览器给服务器发送消息时使用UTF-8编码
              2.login.html的form的method修改为post
              3.在servlet进行解码和编码
                   byte[] bytes=  name.getBytes("ISO-8859-1");
                   name = new String(bytes,"UTF-8");
    

    方法二:在request.getParameter之前加上request.setCharacterEncoding("UTF-8");

    返回中文响应
      在Servlet中加上response.setContentType("text/html",charset="UTF-8");
    

    生命周期

      一个Servlet的生命周期:
           实例化->初始化->提供服务->销毁->被回收
    
    实例化/初始化
        1.当用户通过浏览器输入一个路径
        这个路径对应的servlet被调用的时候该Servlet就会被实例化(构造方法被调用)
         无论访问了多少次LoginServlet构造方法只执行一次,所以Servlet是单实例的
        2.init(ServletConfig)是一个实例方法在构造方法执行之后执行,无论访问多少次初始化只执行一次
    
    提供服务
        service/doGet/doPost方法中执行业务代码
    
    销毁destoy()
      1.关闭tomcat时destroy()方法会被调用
      2.该Servlet所在的web应用重新启动时
             
            <Context path="/" 
                  docBase="e:\\project\\j2ee\\web" 
                  debug="0" reloadable="false" />
         如果把 reloadable="false" 改为reloadable="true" 
        就表示有任何类发生的更新,web应用会自动重启
        当web应用自动重启的时候,destroy()方法就会被调用
    

    跳转

    服务端跳转
      request.getRequestDispatcher("success.html").forward(request, response);
    

    //浏览器路径依然是/login,并不会变成success.html


    success.png
    客户端跳转
     response.sendRedirect("fail.html");//浏览器地址发生变化
    
    fail.png

    自启动

    有的时候会有这样的业务需求: 
      tomcat一启动,就需要执行一些初始化的代码,
      比如校验数据库的完整性等。 
      但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。
      如果没有用户的第一次访问,就无法执行相关代码。 
      这个时候,就需要Servlet实现自启动 
      即,伴随着tomcat的启动,自动启动初始化,
      在初始化方法init()中,就可以进行一些业务代码的工作了。
      在web.xml中,配置Hello Servlet的地方
      增加一句<load-on-startup>10</load-on-startup>
      (取值范围1-99代表启动顺序小的数字先启动)
    
    request常见方法
    response的用法
    上传文件
    CRUD
    JSON

    相关文章

      网友评论

          本文标题:servlet

          本文链接:https://www.haomeiwen.com/subject/gpmllftx.html