Servlet入门与应用学习笔记

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模式详细定义这三部分之间的交互:
  1. 用户和视图(View)进行交互,输入数据并点击按钮
  2. 控制器(Controller)收到来自视图的事件,并对模型(Model)进行操作,根据用户提供的数据更新模型(Model)
  3. 视图同时也会收到“模型更新”的事件通知,从而更新自己,呈现结果给用户
MVC模式在Web中应用:
  1. View处于Web层或者说是Client层,通常是JSP或Servlet,即页面显示部分。
  2. Controller也处于Web层,通常用Servlet来实现,即页面显示的逻辑部分实现。
  3. Model处于Middle层,通常用服务端的JavaBean或者EJB实现,即业务逻辑部分的实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值