Servlet入门与应用学习笔记
学习目标:
-
理解Servlet基本概念
-
掌握Servlet创建步骤
-
理解Servlet的生命周期
-
掌握基于Servlet的MVC的Web应用
一、Servlet的基本概念
1.1 Servlet是什么?
Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互。这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat)。服务器接收到请求后选择相应的Servlet进行处理,并给出响应(response)。
从这里可以看出Servlet并不是独立运行的程序,而是以服务器为宿主,由服务器进行调度的。通常我们把能够运行Servlet的服务器称作Servlet容器,如Tomcat。
1.2 Servlet结构
二、创建Servlet步骤
1. 创建一个类必须继承HttpServlet类 (HttpServlet类不属于JDk中的类);
2. 重写service(HttpServletRequest request,HttpServletResponse response) // 处理请求;
3. 在web.xml中配置Servlet。
案例代码:
Servlet代码如下:
public class MyServlet extends HttpServlet {
// 处理Http请求
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("======MyServlet====service====");
// 设置响应方式与编码
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("hello,MyServlet!");
}
}
Servlet对应的配置如下(配置文件就是web.xml):
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>org.xiaoyi.javaweb.lesson04.web.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/mytest</url-pattern><!--匹配请求的路径:http://myweb/mytest-->
</servlet-mapping>
<!--
注意:1.<servlet>下面的<servlet-name>的内容必须与<servlet-mapping>下面的<servlet-name>相同(大写敏感)
2.在配置url-patter 必须 /
3.<servlet-class> 对应servlet的路径正确
-->
基于Servlet3.0的注解方式创建Servlet,可以使用@WebServlet注释进行配置,案例代码如下:
@WebServlet("/servlet/mytest")
public class MyServlet extends HttpServlet {
// 处理Http请求
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("======MyServlet====service====");
// 设置响应方式与编码
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("hello,MyServlet!");
}
}
需要注意的如果使用@WebServlet("/servlet/mytest")配置,在web.xml文件就可以无需要配置了,对应的请求路径:http://localhost:8080/javaweb-lesson/servlet/mytest
三、理解Servlet的生命周期
实例化(调用构造方法)—>初始化(执行init()方法)—>处理请求(doPost或者doGet)–>销毁相关资源(destory()方法),如图:
案例代码:
/***********************
*
* @author xiaochong 自定义Servlet
*
*/
@WebServlet("/servlet/mytest")
public class MyServlet extends HttpServlet {
// 实例化方法
public MyServlet() {
System.out.println("=====MyServlet实例化=====");
}
// 初始化方法
@Override
public void init() throws ServletException {
System.out.println("=====初始化方法======");
}
// 销毁
@Override
public void destroy() {
System.out.println("=======销毁=======");
}
// 处理Http请求
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("======MyServlet====处理Http请求====");
// 设置响应方式与编码
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("hello,MyServlet!");
}
}
第一次请求Servlet,执行后控制截图如下:
第二次请求Servlet,执行后控制截图如下:
总结生命周期与拓展**
在默认的配置下
Servlet的生命周期:
- 当服务器启动完成,Servlet的生命周期未开始
- 当第一次请求Servlet的时候,此servlet完成 实例化 -->初始化 -->处理请求
- 当地n次(n>1) 请求servlet的时候,servlet仅仅只会执行 处理请求的方法
- 当正常停止服务器,执行destroy()方法。
在web.xml配置,如下
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>org.xiaochong.javaweb.web.servlet.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
表示servlet是在服务器启动就完成实例化和初始化
服务器在管理Servlet是采用单例设计模式(仅仅实例化一个Servlet对象)
四、Servlet应用
完成一个基于Servlet版本的用户登录。
分析:
1、登录页面 login.jsp;
2、处理用户登录请求的LoginServlet;
3、登录成功loginSuccess.jsp和登录失败页面loginError.jsp
注意点:
在实际开发中,我们通常重写如下方法:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("=====doGet========");
}
用它们来分别处理http的get请求和http的post请求,但主要重写了doGet()方法和doPost()方法,不能重写service()方法
举个登录的例子:
login.jsp页面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>基于Servlet的用户登录</title>
</head>
<body>
<h1>基于Servlet的用户登录</h1>
<form action="<%=request.getContextPath()%>/login.do" method="post">
<label>用户名:</label>
<input type="text" name="username" />
<br>
<label>密码:</label>
<input type="password" name="pwd" />
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
LoginServlet代码:
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("utf-8");
// 获得用户名和密码
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
if ("admin".equals(username) && "123456".equals(pwd)) {
response.sendRedirect(request.getContextPath() + "/loginSuccess.jsp");
} else {
response.sendRedirect(request.getContextPath() + "/loginError.jsp");
}
}
}
五、基于Servlet的MVC
模式一:
Model I 体系结构结合使用 JSP 页面和 JavaBean 来开发 Web 应用程序。
问题分析:
1.JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,JSP页面的编写者必须即是网页的设计者又是Java的开发者。
2.内嵌的逻辑使开发人员要理解应用程序的整个流程,必须浏览所有的页面,工作量很大。HTML标签、Java代码和JavaScript代码集中在同一个页面中,使调试变得很困难。
3.强耦合性,变更业务逻辑和数据会涉及到多个页面
因为要解决这些问题,所以有了另一种模式如下
模式二:
Model II 体系结构结合使用 JSP 页面、Servlet和 JavaBean 来开发 Web 应用程序。
此时就有了基于Servler的MVC。
MVC概念:
MVC模式的核心思想是把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层:模型层、视图层、控制层
MVC模式详细定义这三部分之间的交互:
- 用户和视图(View)进行交互,输入数据并点击按钮
- 控制器(Controller)收到来自视图的事件,并对模型(Model)进行操作,根据用户提供的数据更新模型(Model)
- 视图同时也会收到“模型更新”的事件通知,从而更新自己,呈现结果给用户
MVC模式在Web中应用:
- View处于Web层或者说是Client层,通常是JSP或Servlet,即页面显示部分。
- Controller也处于Web层,通常用Servlet来实现,即页面显示的逻辑部分实现。
- Model处于Middle层,通常用服务端的JavaBean或者EJB实现,即业务逻辑部分的实现