Servlet笔记

1. 什么是Servlet

先有Servlet,后来才有Jsp。Jsp的前身就是Servlet。
Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问这个驻留在服务器内存里的Servlet程序。

2. Tomcat容器等级

容器等级

3. 手工编写第一个Servlet

  1. 继承HttpServlet
  2. 重写doGet()或者doPost()方法
  3. 在web.xml中注册Servlet
    手工编写Servlet
    HelloServlet.java
    新建类时,记得继承HttpServlet喔
@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("处理Get()请求。。。。");
        PrintWriter out = response.getWriter();
        response.setContentType("text/html;charset=utf-8");
        out.println("<strong>Hello Servlet!<strong><br>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("处理Post()请求。。。。");
        PrintWriter out = response.getWriter();
        response.setContentType("text/html;charset=utf-8");
        out.println("<strong>Hello Servlet!<strong><br>");
    }

web.xml(注册servlet)

<servlet>   
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <!-- 访问这个servlet的路径 -->
        <url-pattern>/servlet/HelloServlet</url-pattern>
  </servlet-mapping>

index.jsp(访问servlet)

<body>
    <h1>第一个servlet小例子</h1>
    <hr>
    <!-- 访问路径servlet/HelloServlet -->
    <a href="servlet/HelloServlet">Get方式请求HelloServlet</a><br>
    <form action="servlet/HelloServlet" method="post">
        <input type="submit" value="Post方式请求HelloServlet"/>
    </form>
  </body>

使用MyEcliose直接新建servlet则更简单:新建servlet后直接重写doGet()和doPost()方法,然后再index.jsp或其他页面访问即可

4. Servlet生命周期

4.1 访问servlet是程序流程

流程
生命周期
响应客户请求阶段,调用service()方法,由service()方法根据提交方式选择执行doGet()或者doPost()方法

4.2 Tomcat装载Servlet的三种情况

  1. servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的<Servlet></Servlet>之间添加如下代码:<loadon-startup>1</loadon-startup>数字越小表示优先级别越高。
  2. 在Servlet容器启动后,客户首次向Servlet发送请求。
  3. Servlet类文件被更新后,重新装载Servlet
    * Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,inti()方法只被调用一次。 *

4.3 Servlet生命周期

生命周期
这里写图片描述

5. Servlet获取九大内置对象

这里写图片描述

6. Servlet与表单

6.1 reg.jsp表单中填写数据,action提交到RegServlet,在RegServlet中将表单传过来的数据封装在一个User对象中,将其设置为属性,然后跳转到userinfo.jsp,在userinfo.jsp把数据显示出来

reg.jsp

<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'reg.jsp' starting page</title>
    <style type="text/css">
     .label{
          width: 20%    
     }
     .controler{
          width: 80%    
     }
   </style>  
   <script type="text/javascript" src="js/Calendar3.js"></script>
  </head>

  <body>
    <h1>用户注册</h1>
    <hr>
    <form name="regForm" action="servlet/RegServlet" method="post" >
              <table border="0" width="800" cellspacing="0" cellpadding="0">
                <tr>
                    <td class="lalel">用户名:</td>
                    <td class="controler"><input type="text" name="username" /></td>
                </tr>
                <tr>
                    <td class="label">密码:</td>
                    <td class="controler"><input type="password" name="mypassword" ></td>
                </tr>
                <tr>
                    <td class="label">确认密码:</td>
                    <td class="controler"><input type="password" name="confirmpass" ></td>
                </tr>
                <tr>
                    <td class="label">电子邮箱:</td>
                    <td class="controler"><input type="text" name="email" ></td>
                </tr>
                <tr>
                    <td class="label">性别:</td>
                    <td class="controler"><input type="radio" name="gender" checked="checked" value="Male"><input type="radio" name="gender" value="Female"></td>
                </tr>
                <tr>
                    <td class="label">出生日期:</td>
                    <td class="controler">
                      <input name="birthday" type="text" id="control_date" size="10"
                      maxlength="10" onclick="new Calendar().show(this);"  />
                    </td>
                </tr>
                <tr>
                    <td class="label">爱好:</td>
                    <td class="controler">
                    <input type="checkbox" name="favorite" value="nba"> NBA &nbsp;
                      <input type="checkbox" name="favorite" value="music"> 音乐 &nbsp;
                      <input type="checkbox" name="favorite" value="movie"> 电影 &nbsp;
                      <input type="checkbox" name="favorite" value="internet"> 上网 &nbsp;
                    </td>
                </tr>
                <tr>
                    <td class="label">自我介绍:</td>
                    <td class="controler">
                        <textarea name="introduce" rows="10" cols="40"></textarea>
                    </td>
                </tr>
                <tr>
                    <td class="label">接受协议:</td>
                    <td class="controler">
                        <input type="checkbox" name="isAccept" value="true" checked="checked">是否接受霸王条款
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" value="注册"/>&nbsp;&nbsp;
                        <input type="reset" value="取消"/>&nbsp;&nbsp;
                    </td>
                </tr>
              </table>
            </form>
  </body>
</html>

RegServlet.java

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        Users u = new Users();
        String username, mypassword, gender, email, introduce, isAccept;
        Date birthday;
        String[] favorites;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            // 接收表单传过来的数据(用户输入的)
            username = request.getParameter("username");
            mypassword = request.getParameter("mypassword");
            gender = request.getParameter("gender");
            email = request.getParameter("email");
            introduce = request.getParameter("introduce");
            birthday = sdf.parse(request.getParameter("birthday"));
            // 用来获取多个复选按钮的值
            favorites = request.getParameterValues("favorite");
            if (request.getParameterValues("isAccept") != null) {
                isAccept = request.getParameter("isAccept");
            } else {
                isAccept = "false";
            }

            // 将从表单获取的值封装成一个User对象
            u.setUsername(username);
            u.setMypassword(mypassword);
            u.setGender(gender);
            u.setEmail(email);
            u.setFavorites(favorites);
            u.setIntroduce(introduce);
            // u.setAccept(isAccept.equals("true")?true:false);
            if (isAccept.equals(true)) {
                u.setFlag(true);
            } else {
                u.setFlag(false);
            }
            u.setBirthday(birthday);

            // 把注册成功的用户对象保存在session中
            request.getSession().setAttribute("regUser", u);
            // 跳转到注册成功的页面
            request.getRequestDispatcher("../userinfo.jsp").forward(request,
                    response);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

userinfo.jsp

<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'userinfo.jsp' starting page</title>
    <style type="text/css">
     .title{
         width: 30%;    
         background-color: #CCC;
         font-weight: bold;
     }
     .content{
         width:70%;
         background-color: #CBCFE5;
     }
   </style>  
  </head>

  <body>
    <h1>用户信息</h1>
    <hr>
    <center>
     <jsp:useBean  id="regUser" class="entity.Users"  scope="session" />   
     <table width="600" cellpadding="0" cellspacing="0" border="1">
        <tr>
          <td class="title">用户名:</td>
          <td class="content">&nbsp;<jsp:getProperty name="regUser" property="username"/></td>
        </tr>
        <tr>
          <td class="title">密码:</td>
          <td class="content">&nbsp;<jsp:getProperty name="regUser" property="mypassword"/></td>
        </tr>
        <tr>
          <td class="title">性别:</td>
          <td class="content">&nbsp;<jsp:getProperty name="regUser" property="gender"/></td>
        </tr>
        <tr>
          <td class="title">E-mail:</td>
          <td class="content">&nbsp;<jsp:getProperty name="regUser" property="email"/></td>
        </tr>
       <%-- readonly="readonly"   --%>
        <tr>
          <td class="title">出生日期:</td>
          <td class="content">&nbsp;
            <% 
               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
               String date = sdf.format(regUser.getBirthday());

            %>
             <%=date%>
          </td>
        </tr>

        <tr>
          <td class="title">爱好:</td>
          <td class="content">&nbsp;
            <% 
               String[] favorites = regUser.getFavorites();
               for(String f:favorites)
               {
            %>
                <%=f%> &nbsp;&nbsp;
            <% 
               }
            %>
          </td>
        </tr>
        <tr>
          <td class="title">自我介绍:</td>
          <td class="content">&nbsp;<jsp:getProperty name="regUser" property="introduce"/></td>
        </tr>
        <tr>
          <td class="title">是否接受协议:</td>
          <td class="content">&nbsp;<jsp:getProperty name="regUser" property="flag"/></td>
        </tr>
     </table>
    </center>
  </body>
</html>

6.2 用servlet实现用户登录

login.jsp

<body>
  <div id="container">
            <div class="logo">
                    <a href="#"><img  src="assets/logo.png" alt=""/></a>
            </div>
            <div id="box">
                    <form action="servlet/LoginServlet" method="post">
                    <p class="main">
                            <label>用户名:</label>
                            <input name="username" value=""/>
                            <label>密码: </label>
                            <input type="password" name="password" value="">
                    </p>
                    <p class="space">
                            <input type="submit" value="登录" class="login" style="cursor: pointer;"/>
                    </p>        
                    </form>
            </div>
  </div>
  </body>

LoginServlet.java

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Users u = new Users();
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        u.setUsername(username);
        u.setPassword(password);

        request.getSession().setAttribute("loginUser", u);

        //判断用户名和密码是否合法
        if (u.getUsername().equals("admin")&&u.getPassword().equals("admin")) {
            response.sendRedirect(request.getContextPath()+"/login_success.jsp");
        }else {
            response.sendRedirect(request.getContextPath()+"/login_failure.jsp");

        }
    }

7. Servlet路径跳转

通过index.jsp页面直接请求servlet

<body>
   <h1>Servlet路径跳转</h1>
   <hr>
                                        <!-- 通过index.jsp页面直接请求servlet -->
   <!-- <url-pattern>/servlet/HelloServlet</url-pattern>必须以/开头,这个开头的/表示项目的根目录 -->

   <!-- 使用相对路径访问HelloServet -->
   <!--  /servlet/HelloServlet 第一个/表示服务器的根目录,而不是项目的根目录,所以不行 -->
   <a href="servlet/HelloServlet">用相对路径访问HelloServlet</a><br>

   <!-- 使用绝对路径访问HelloServet  可以使用path变量,它表示项目的根目录-->
   <a href="<%=path%>/servlet/HelloServlet">用绝对路径访问HelloServet</a><br>
  <!-- 表单中action的URL地址写法,与超链接方式完全相同(可以用相对路径也可用绝对路径) -->


  <!-- 通过index.jsp页面访问TestServlet,然后跳转到test.jsp  -->
  <a href="servlet/TestServlet">访问TestServlet</a><br>
  </body>

通过index.jsp页面访问TestServlet,然后跳转到test.jsp

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //不行哦,请求重定向方式跳转到test.jsp,在当前路径下寻找test.jsp,
        //而当前路径是MServlet_PathDorection/servlet/TestServlet
        //response.sendRedirect("test.jsp");
        //不行哦,这个/表示服务器根目录
        //response.sendRedirect("/test.jsp");
        //可以的,..表示回到上层路径,然后再找test.jsp
        //response.sendRedirect("../test.jsp");
        //可以的,如果要用请求重定向的方法,那么必须获得上下文对象getContextPath()
        //response.sendRedirect(request.getContextPath()+"/test.jsp");//可以

        //同请求转发一样,不行
        //request.getRequestDispatcher("test.jsp").forward(request, response);
        //可以的,服务器内部跳转,这里的/表示项目的根目录(特别注意,这个和response.sendRedirect不同)
        request.getRequestDispatcher("/test.jsp").forward(request, response);
        //可以的,..表示回到上层路径,然后再找test.jsp
        //request.getRequestDispatcher("../test.jsp").forward(request, response);
        //不行哦,没有出现错误,但test.jsp页面没有出来。这是什么原因???
        //request.getRequestDispatcher(request.getContextPath()+"/test.jsp");
    }

8.servlet初始化参数的设置与获取

设置初始化参数
获取初始化参数

9. MVC与Model2

mvc
model1
model2

10. 阶段项目

使用MVC的Model2思想实现购物车功能
开发步骤
这里写图片描述
购物车类属性和方法分析(三个方法、两个属性)
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值