我们使用网络提交数据到服务器的时候,tomcat服务器对于请求到servlet类的数据处理过程是这样的:首先进入该Web应用下的web.xml配置文件,根据servlet配置好的映射名查找到指定了servlet类生成的字节码文件目录的servlet名称。实例化servlet。初次访问servlet时,tomcat对于servlet的生命周期管理如下:加载类->实现构造方法—>init()->service()-doGet()/doPose()..。之后再有数据访问到servlet时,重复执行service()-doGet()/doPose()..的操作。关闭服务器时,先执行servlet的destroy()方法,最后关闭服务器。
由以上的信息,我们可以知道,一个类型的servlet在同一个服务器中之实例化一个,也就是说servlet的访问是多线程的。所以我们尽量不在在servlet里面定义成员属性(限制了servlet的使用范围)。关于servlet的生命周期和多线程的访问管理,由服务器来完成。以下,通过一些常见的操作,来初见servlet的使用。
最简单的servlet
1.新建Web应用,并创建一个集成javax.servlet.http.HttpServlet的子类并且重写doGet()方法,类的创建如下:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LBCServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter outWriter = resp.getWriter();
outWriter.print("Hello,Servlet!");
outWriter.flush();
outWriter.close();
}
}
2.配置servlet
(1)指定servlet所在位置配置servlet的名称:
<!-- 配置servlet名称 -->
<servlet>
<servlet-name>LBCServlet</servlet-name>
<servlet-class>servlet.LBCServlet</servlet-class>
</servlet>
(2)根据servlet名称配置servlet的外部访问路径:
<!-- 配置servlet的映射路径 -->
<servlet-mapping>
<servlet-name>LBCServlet</servlet-name>
<!-- 这里使用到“/”表示所在位置为当前Web应用目录下 -->
<url-pattern>/LBCServlet</url-pattern>
</servlet-mapping>
3.发布该Web应用,在浏览器输入servlet的地址:该web应用根目录/LBCServlet,得到:
Hello,Servlet!
处理servlet的乱码问题:
1.设置eclipse全局编码格式
2.设置当前文件的编码格式
3.设置tomcat的编码格式
4.代码内设置编码格式
resp.setContentType("text/html; charset=utf-8");
5.同一浏览器的编码格式,因为不同的浏览器切换显示编码格式的步骤不同,在这里不做累述
实现简单夜间交互的servlet
1.设置HTML页面表单form文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="LBCServlet" method="get">
用户名:<input type="text" name="user"><br/>
账号:<input type="text" name="acount"><br/>
<input type="checkbox" name="hobies" value="吃饭">吃饭饭
<input type="checkbox" name="hobies" value="睡觉">睡觉觉
<input type="submit" value="提交数据">
</form>
</body>
</html>
2,设置servlet
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LBCServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 获取方法
req.setCharacterEncoding("utf-8");
String user = req.getParameter("user");
String acount = req.getParameter("acount");
String[] hobies = req.getParameterValues("hobies");
System.out.println("用户名:"+user);
System.out.println("账户:"+acount);
System.out.print("爱好:");
if (hobies!=null) {
for (String string : hobies) {
System.out.print(string+" ");
}
}
resp.sendRedirect("success.html");
}
}
3.配置servlet
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LBCServlet</display-name>
<!-- 配置servlet名称 -->
<servlet>
<servlet-name>LBCServlet</servlet-name>
<servlet-class>servlet.LBCServlet</servlet-class>
</servlet>
<!-- 配置servlet的映射路径 -->
<servlet-mapping>
<servlet-name>LBCServlet</servlet-name>
<url-pattern>/LBCServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
4.编写返回页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎光临LBC测试系统
</body>
</html>
获取页面和servlet设置页面跳转的方式有以下几种:
1.使用getParameterNames()和服务器内页面跳转技术
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.nio.cs.ext.GBK;
public class LBCServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 不知道参数名
//req.setCharacterEncoding("GBK");
Enumeration parameterEnumeration = req.getParameterNames();
while(parameterEnumeration.hasMoreElements()){
String parameterName = (String)parameterEnumeration.nextElement();
String parameterValue = req.getParameter(parameterName);
System.out.println(parameterName+":"+parameterValue);
}
// 使用服务器内跳转
RequestDispatcher dispatcher = req.getRequestDispatcher("success.html");
dispatcher.forward(req, resp);
}
}
2.使用getParameterMap()
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.nio.cs.ext.GBK;
public class LBCServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 不知道数据名
Map parameterMap = req.getParameterMap();
Set parameterKey = parameterMap.keySet();
Iterator parameterItr = parameterKey.iterator();
while(parameterItr.hasNext()){
String key = (String) parameterItr.next();
String[] values = (String[]) parameterMap.get(key);
for (String string : values) {
System.out.println(string);
}
}
// 使用服务器内跳转
RequestDispatcher dispatcher = req.getRequestDispatcher("success.html");
dispatcher.forward(req, resp);
}
}
我们使用
RequestDispatcher dispatcher = req.getRequestDispatcher("success.html");
dispatcher.forward(req, resp);
实现服务器内跳转减少客户端与服务器的请求次数,如果在servlet之间跳转数据时需要传递参数,我们需要使用到setAttitude(参数名,参数值)和getAttitude(参数名)来实现参数之间的传递。