servlet学习笔记(一)之servlet入门教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33945246/article/details/79810723

一、知识准备

  • servlet 是在服务器上运行的小程序,一个 servlet 就是一个 Java 类,并且可以通过 “请求 - 响应” 编程模式来访问这个驻留在服务器内存里面的 servlet 程序

  • tomcat 容器等级以及 servlet 的位置
    这里写图片描述


二、编写 servlet

  • 继承 HTTPServlet,在创建时,直接指定父类
  • 重写 doGet() 或者 doPost() 方法,右击 ->source->override
  • 在 web.xml 中注册 Servlet
  • 注意: 在使用 myeclipse2017 时,新建的 web 项目没有 web.xml 文件,
    解决:在新建项目之后,填写完项目名,不要点 finish 要点 next,然后选中创建 web.xml 文件
  • 使用 myeclipse 编写 servlet
    1. src->new->servlet
    2. 重写 doGet()doPost()
    3. 部署运行

三、tomcat 容器装载 servlet

  • servlet 容器启动时会自动装载某些 servlet,需要提前在 web.xml 文件中添加如下代码
    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>servlet.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/servlet/HelloServlet</url-pattern>
    </servlet-mapping>
  • servlet 类文件被更新后,重新装载 servlet
  • servlet 被装载后,servlet 容器创建一个 servlet 实例并且调用 servlet 的 init() 方法进行初始化
  • servlet 与 jsp 的内置对象的一一对应
    这里写图片描述

四、servlet 生命周期

  • 初始化阶段,调用 init() 方法
  • 响应客户端的请求,调用 service() 方法,根据提交方式选择执行 doGet() 或者 doPost() 方法
  • 终止阶段,调用 destroy() 方法
    这里写图片描述

五、servlet 获取客户端数据的流程

  • 在 src 下的 entity 包建立实体类 user.java,遵循 JavaBean 的设计规则
  • 在 WebRoot 下建立浏览器的主页面,reg.jsp 文件
  • reg.jsp 页面的表单提交的 action 时跳转到 src 的 servlet 包的 RegServlet.java 文件
  • 在 RegServlet.java 中, 需要重写 doGet() 或者 doPost() 方法,通常情况时只重写 doPost() 方法。然后在 doGet() 中调用 doPost() 方法
  • 重写 doPost() 方法时,通过 request.getParameter(“属性名”),获取表单所提交属性值,在利用 user 实体类的 set 方法给实体对象 u 赋值,最后 request.getSession().setAttribute(“regUser”, u); 把赋值成功的实体对象保存在 session 中,其中”regUser” 是用来传递 session 的 id,此时他的类型是 user。request.getRequestDispatcher(“../userinfo.jsp”).forward(request,response) 跳转页面
  • 简而言之:通过 request 给实体类赋值,在把赋值好的实体保存在 session 中,最后通过 request 的服务器内部跳转方式,跳转到其他页面,此时信息已经在 session 中,即:获取 -> 赋值 -> 保存 -> 跳转
  • 跳转到 jsp 的显示信息页面,本页面使用 JavaBean,范围 scope 设定为 session
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import entity.Users;

public class RegServlet extends HttpServlet {

    /**
     * Constructor of the object.
     */
    public RegServlet() {
        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 {

        doPost(request, response);
    }

    /**
     * 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 {

        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"));
            if (request.getParameterValues("isAccpet") != null) {
                isAccept = request.getParameter("isAccept");
            } else {
                isAccept = "false";
            }
            // 用来获取多个复选按钮的值
            favorites = request.getParameterValues("favorite");
            u.setUsername(username);
            u.setMypassword(mypassword);
            u.setGender(gender);
            u.setEmail(email);
            u.setFavorites(favorites);
            u.setIntroduce(introduce);
            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 ex) {
            ex.printStackTrace();
        }

    }

    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException
     *             if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
    }

}
  • 在建立 servlet 的时候,建立的 web.xml 会报错(本人用的是 myeclipse2017)报错的原因也很无语,是因为 servlet 标签里面的 description 和 display-name 没有放到 servlet 的标签的最上面
    在修改 servlet 的时候,要注意,当修改运行之后,却页面却没有变化,是因为 servlet 还没有编译,这时你需要先在服务器项目管理中删掉项目,在重新部署一次,就可以了

六、servlet 路径跳转

1. 访问 servlet
相对路径:”servlet/helloservlet”
使用相对路径时,最开头不能有斜杠,此时是在 tomcat 服务器下
绝对路径:”<%=path%>/servlet/helloservlet”
使用绝对路径时,path 是全局变量,代表项目上下文,此时实在项目下,需要斜杠
2. 从 servlet 跳转到 jsp 的路径
绝对路径:request.getContextPath()+”/test.jsp”
相对路径: “../test.jsp”

注:
1. 在复制一个 web 项目之后,用过 web 的方式无法在更改虚拟路径,此时需要在 deployment assembly 下更改 web context root
2. 在使用 request 进行服务器内部跳转时,不要忘记后面的 forward,来传递 request 和 response

获取初始化参数
在 web.xml 文件中,在 servlet 标签中,可以通过

属性名
属性值

在 servlet 标签中可以有多个 init-param 标签,通过里面的设定属性,并为其复制
然后在 servlet 文件中,进行初始化:
先 private String username; 在 set 和 get 方法
最后在重写的 init() 方法里面赋值:this.setUsername(this.getInitParameter(“username”));
此时的 this 就是 servlet 的对象

MVC 视图:截图

model2 视图:截图

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/79810723