一、知识准备
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
- src->new->servlet
- 重写 doGet()doPost()
- 部署运行
三、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 视图:截图