Servlet的基础知识与使用方法

---------------------------------First---------------------------------

一、Servlet基础

1.1 Servlet是什么

    Servlet是一种基本组件规范,和JSP,Filter,Tag,Listener等同样是属于Java Web的基本组件。

    Servlet一般是作为控制层处理视图层的请求操作的。

1.2 Servlet的原理


图1. servlet原理图

    刚才说Servlet一般是作为控制层处理前台页面的请求操作的,关于Servlet与客户端请求之间的一个过程首先客户端即前台发送一个请求。Servlet调用service()方法进行响应处理。常用的请求方式是get和post方式,service()方法中对请求方式进行了匹配调用doget()或者doPost()等方法,然后在对应的方法中调用相关对象、方法、参数等处理业务,实现对客户端请求的响应。本身Servlet接口是没有doGet()、doPost()等方法的。HttpServlet中定义了这些方法。所以实际开发中我们会通过继承HttpServlet来创建Servlet类。

1.3 Servlet的生命周期

Servlet的生命周期过程如下:

    1>. Servlet容器加载阶段

    2>. 初始化阶段 init(ServletConfig sc)

        -->该方法仅被加载一次,用于初始化操作。

    3>. 响应服务阶段 service(ServletRequest request, ServletResponse response)

        -->每次请求都会调用该方法,该方法用于请求响应操作。

    4>. 销毁阶段 destroy()

 ---------------------------------Second---------------------------------

二、WEB应用中的Servlet

2.1 Servlet接口类实现

    新建一个类TestServlet,然后实现Servlet接口。

代码如下:

(阅读源码有助于更好的理解)

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class TestServlet implements Servlet{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	}

}

    这就是直接实现Servlet接口的类所有要实现的方法。通过这些方法我们能够更好的理解Servlet的生命周期。

2.2 配置与映射

    在WEB应用中新建上述类 TestServlet,并在web.xml文件中配置注册Servlet及映射servlet-mapping

配置如下:

  <!-- 注册和映射  servlet -->
  <servlet>
  	<!-- 1>Servlet注册的名字 -->
  	<servlet-name>testServlet</servlet-name>
  	<!-- 2>Servlet的全类名 -->
  	<servlet-class>cn.edu.hpu.rfeng.TestServlet</servlet-class>
  	
  	<!-- 3>配置Servlet的初始化参数 -->
  	<init-param>
  		<!-- 初始化一个参数user其数据为root -->
  		<param-name>user</param-name>
  		<param-value>root</param-value>
  	</init-param>
  	
  	<init-param>
  		<param-name>password</param-name>
  		<param-value>123456</param-value>
  	</init-param>
  </servlet>
  
  <servlet-mapping>
  	<!-- 2.1>需要和某一个servlet name一致 -->
  	<servlet-name>testServlet</servlet-name>
  	<!-- 2.2>映射具体的访问路径:‘/’代表当前WEB应用的根目录 -->
  	<url-pattern>/test</url-pattern>
  </servlet-mapping>

    配置后可测试该Servlet。

2.3 运行测试一个Servlet

    在tomcat7下运行该WEB应用,浏览器上访问对应TestServlet的路径,访问 5 次即发出 5 次对TestServlet的请求。对应请求的响应结果输出在控制台。

如图所示:


图2.模拟请求servlet图


图3.模拟Servlet响应请求图

    根据结果看到,5次请求的响应结果中,Servlet都调用了service()方法,init()只调用了一次。

    init()方法仅在第一次被Servlet容器加载时调用了一次。所以初始化操作一般在init()方法中操作。

    service()方法会对每次请求给出响应。一般响应操作逻辑代码写在Servlet的service()方法中。

2.4 实际开发中的Servlet

    一般不会通过实现Servlet这个接口来写控制层的Servlet。实际开发中通过继承HttpServlet,覆盖其中的doPost(),doGet()方法来处理视图层传来的请求。(一般可以通过开发工具直接创建一个servlet文件)

    新建Servlet文件DevelopServlet,

代码如下:

import java.io.IOException;

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

public class DevelopServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

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

	}

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

	}

}
    可以直接在doGet(),doPost方法中写对请求的处理操作。

2.5 Servlet下的request与response

    servlet下有HttpServletRequest,HttpServletResponse,ServletRequest,ServletResponse对象。看命名大致也能看出这些对象之间的联系。其中request对象简单来说就是用于接收客户端浏览器提交的数据,response对象则将服务端的数据发送到客户端浏览器

    request对象的常用方法:

setAttribute(String name,Object o): 设置属性名和属性值
Object getAttribute();获取属性值
Enumeration getAttributeNames();获取所有属性组成的名字
void removeAttribute(String a)移除指定对象的属性
getParameter()获取参数

---------------------------------Third---------------------------------

三、模拟案例

模拟登录案例

3.1 案例描述

    前端html页面有个表单有两个文本框,向服务端发送请求,Servlet接收处理请求,获取请求参数。将浏览器传来的数据和默认的用户数据user:zhangsan;password:123456进行比对。若比对成功,处理操作返回前台页面并提示用户登录成功!若比对失败,也返回前台页面提示用户名或密码错误!

3.2 案例实现

    1>在WEB项目下新建登录页面 login.html

代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="DevelopServlet" method="post">
		账户:<input type="text" name="name" /><br>
		密码:<input type="password" name="password" /><br>
		<input type="submit" value="login" />
	</form>
</body>
</html>

    点击对应页面的登录按钮,会向DevelopServlet发出请求,Servlet接收请求并响应

    2>在DevelopServlet中的逻辑操作

代码如下:

import java.io.IOException;

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

public class DevelopServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取请求参数
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		//比对数据并做出处理
		if (name.equals("zhangsan") && password.equals("123456")) {
			response.sendRedirect("success.html");//重定向到登录成功页面
			return;
		}
		response.sendRedirect("error.html");//重定向到登录失败页面
	}
}
    其中的success.html和error.html文件就很简单了,实现在页面显示登录成功或失败的字样。
    3>web.xml配置文件

注意:对Servlet必须在web.xml文件中进行注册映射。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
	<!--注册servlet -->
  <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的命名 -->
    <servlet-name>DevelopServlet</servlet-name>
    	<!-- servlet类全类名,包名加上类名 -->
    <servlet-class>cn.edu.hpu.rfeng.DevelopServlet</servlet-class>
  </servlet>
	<!-- 配置映射 -->
  <servlet-mapping>
    <servlet-name>DevelopServlet</servlet-name>
    <url-pattern>/DevelopServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

3.3 运行演示

    在tomcat7下运行该WEB应用:

效果如下:

    1>文本框输入正确的账户密码时:点击登录按钮经servlet处理请求重定向到登录成功页面


图4.正确账户登录图


图5.登录成功图


    2>错误情况下:经servlet处理验证账户错误重定向到登录错误提示页面

图6.错误账户登录图

图7.登录失败图

---------------------------------The End---------------------------------

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐