1 实验目的
- 掌握Servlet工作原理;
- 重点掌握Servlet设计要点;
- 在JSP中灵活运用Servlet。
2实验注意事项
- Servlet向导生成的doGet()方法中使用response.setContentType(“text/html;charset=UTF-8”);避免输出中文乱码;
- 表单提交数据是,应使用:request.setCharacterEncoding(“utf-8”);解决post提交的中文乱码问题;
- Servlet的访问路径是在设计Servlet时由Mapping URL决定的,用户访问Servlet路径为:项目虚拟路径+Mapping URL路径,表单提交或页面跳转时,要注意源文件路径与目标文件URL路径之间的关系,要灵活运用“. /”、 “. ./”、“/”相对路径符号:
“. /”:页面基准路径是当前路径;
“. ./”:上一级路径;
“/”:Web服务器的根路径。
3 实验任务与步骤
3.1 Servlet输出表单的全部数据项
任务描述:
设计一个Servlet接收表单,寻找表单传过来的所有变量名称,并将其放入表格中,没有值或有多个值的变量都突出显示。
首先,通过HttpServletRequest的getParameterNames()方法获取表单中所有变量的名称,该方法返回的是一个枚举类型集合(Enumeration),接下来循环遍历该Enumeration,通过hasMoreElements()方法确定何时结束循环,通nextElement()方法得到集合中各个项,nextElement()方法返回的是Object类型,需要将其强制转换为所需要的String类型。再调用getParameterValues()方法得到字符串数组如果这个数组只有一个元素且为空字符串,说明这个表单变量没有值,Servlet以斜体形式输出“No Value”,如果数组元素个数大于1,说明这个表单变量有多个值,以列表形式输出这些值;其它情况下Servlet直接把变量值放入表格。
3.1.1 创建ShowParameterServlet.java
%PROJECTROOT%/src/exp05/bean/ShowParameterServlet.java
的内容如下:`
package exp05.bean;
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;
import java.util.*;
public class ShowParameterServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "读取所有请求参数";
out.println(ServletUtilities.headWithTitle(title)
+ "<BODY BGCOLOR=\"#FDF5E6\">\n"
+ "<H1 ALIGN=CENTER>" + title + "</H1>\n"
+ "<TABLE BORDER=1 ALIGN=CENTER>\n"
+ "<TR BGCOLOR=\"#FFAD00\">\n"
+ "<TH>参数名字<TH>参数值");
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
out.println("<TR><TD>" + paramName + "\n<TD>");
String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0) {
out.print("<I>No Value</I>");
} else {
out.print(paramValue);
}
} else {
out.println("<UL>");
for (int i = 0; i < paramValues.length; i++) {
out.println("<LI>" + paramValues[i]);
}
out.println("</UL>");
}
}
out.println("</TABLE>\n</BODY></HTML>");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3.1.2 编写ServletUtilities.java
ShowParameterServlet.java中使用了ServletUtilities类的headWithTitle(String title)方法设置页面head信息
%PROJECTROOT%/src/exp05/bean/ServletUtilities.java
的内容如下:
package exp05.bean;
public class ServletUtilities {
public static final String DOCTYPE
= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">";
public static String headWithTitle(String title) {
return (DOCTYPE + "\n" + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n");
}
}
3.1.3 编写postForm.html
%WEBROOT%/jsp/exp05/content01/postForm.html
的内容如下:
<!DOCTYPE html>
<HTML>
<HEAD>
<TITLE>示例页面</TITLE>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">用Post方法发送表单</H1>
<FORM ACTION="../../../ShowParameterServlet" METHOD="POST">
职工编号:<INPUT TYPE="TEXT" NAME="xh"><BR>
职工姓名:<INPUT TYPE="TEXT" NAME="name"><BR>
所学专业:<INPUT TYPE="TEXT" NAME="zy" value="通讯工程"><BR> <HR>
email:<INPUT TYPE="TEXT" NAME="email"><BR>
联系电话:<INPUT TYPE="TEXT" NAME="tele"><BR>
家庭住址: <TEXTAREA NAME="address" ROWS=3 COLS=40></TEXTAREA><BR>
银行卡类型:<BR>
<INPUT TYPE="RADIO" NAME="cardType" value="Visa">Visa<BR>
<INPUT TYPE="RADIO" NAME="cardType" value="Amex">American Express<BR>
<INPUT TYPE="RADIO" NAME="cardType" value="Discover">Discover<BR>
<INPUT TYPE="RADIO" NAME="cardType" value="Java SmartCard">SmartCard<BR>
银行卡号: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR>
请重复输入银行卡号: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR><BR>
<CENTER> <INPUT TYPE="SUBMIT" value="提交"> </CENTER>
</FORM>
</BODY>
</HTML>
3.1.4 编写web.xml配置文件
%WEBROOT%/WEB-INF/web.xml
的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>ShowParameterServlet</servlet-name>
<servlet-class>exp05.bean.ShowParameterServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>exp05.bean.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowParameterServlet</servlet-name>
<url-pattern>/ShowParameterServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
3.1.5 测试运行
http://localhost:8081/Study/jsp/exp05/content01/postForm.html
3.2 用户登录验证功能
任务描述:
编写JSP程序,实习用户提交登录表单数据到Servlet,由Servlet查询数据库,对用户是否存在进行验证。
3.2.1 创建数据库db_user
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`loginname` varchar(15) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '张转', '123');
INSERT INTO `user` VALUES ('2', '杨和', '123');
INSERT INTO `user` VALUES ('3', '李智', '123');
INSERT INTO `user` VALUES ('4', '何辉', '123');
INSERT INTO `user` VALUES ('5', 'tom', '123');
3.2.2 编写DBConn.java
%PROJECTROOT%/src/exp05/bean/DBConn.java
的内容如下:
package exp05.bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBConn {
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/db_user?useUnicode=true&characterEncoding=utf-8";
private static final String DATABASE_USRE = "root";
private static final String DATABASE_PASSWORD = "root";
// 返回连接
public static Connection getConnction() {
Connection dbConnection = null;
try {
Class.forName(DRIVER_CLASS);
dbConnection = DriverManager.getConnection(DATABASE_URL,
DATABASE_USRE, DATABASE_PASSWORD);
} catch (ClassNotFoundException | SQLException e) {
}
return dbConnection;
}
// 关闭连接
public static void closeConnection(Connection dbConnection) {
try {
if (dbConnection != null && (!dbConnection.isClosed())) {
dbConnection.close();
}
} catch (SQLException sqlEx) {
}
}
// 关闭结果集
public static void closeResultSet(ResultSet res) {
try {
if (res != null) {
res.close();
res = null;
}
} catch (SQLException e) {
}
}
public static void closeStatement(PreparedStatement pStatement) {
try {
if (pStatement != null) {
pStatement.close();
pStatement = null;
}
} catch (SQLException e) {
}
}
}
3.2.3 编写LoinServlet.java
%PROJECTROOT%/src/exp05/bean/LoinServlet.java
的内容如下:
package exp05.bean;
import java.io.IOException;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginServlet extends HttpServlet {
public LoginServlet() {
super();
}
@Override
public void destroy() {
super.destroy();
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("loginName");//
String passWord = request.getParameter("passWord");//
String sql = "select * from user"; //
sql += " where loginname='" + userName + "' and password='" + passWord + "'";
HttpSession session = request.getSession();
Connection con = DBConn.getConnction();
Statement stmt;
ResultSet rs;
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) //
{
session.setAttribute("userName", userName); //
response.sendRedirect("jsp/exp05/content02/welcome.jsp");
} else {
response.sendRedirect("jsp/exp05/content02/loginFail.jsp");//
}
} catch (SQLException e) {
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
@Override
public void init() throws ServletException {
}
}
3.2.4 编写login.html
%WEBROOT%/jsp/exp05/content02/login.html
的内容如下:
<!DOCTYPE html>
<html>
<head>
<title>login.html</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
</head>
<body>
<table align="center">
<tr><td align="center"><p>
<font color="red" size="3" style="font-family:simhei">请登录</font><p>
<form method="post" action="../../../LoginServlet" target="_blank"><p>
用户名:<input type="text" name="loginName" size="20"><p >
密 码:<input type="password" name="passWord" size="20"><p >
<input type="submit" value="提交">
<input type="reset" value="重置">
</form></td></tr>
</table>
</body>
</html>
3.2.5 编写webcome.jsp
%WEBROOT%/jsp/exp05/content02/webcome.jsp
的内容如下:
<%--
Document : loginFail
Created on : 2018-10-5, 23:07:34
Author : Administrator
--%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功</title>
</head>
<body>
<font size="2" color="red">
<%
Date today = new Date();
int d = today.getDay();
int h = today.getHours();
String s = "";
if (h > 0 && h < 12) {
s = "上午好!";
} else if (h >= 12) {
s = "下午好!";
}
String day[] = {"日", "一", "二", "三", "四", "五", "六"};
out.println(s + " 今天是: 星期" + day[d]);
%></font><br>
<%=session.getAttribute("userName")%>,恭喜你,登录成功! <br>
</body>
</html>
3.2.6 编写loginFail.jsp
%WEBROOT%/jsp/exp05/content02/loginFail.jsp
的内容如下:
<%--
Document : loginFail
Created on : 2018-10-5, 23:07:34
Author : Administrator
--%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head> <title>登录失败</title></head>
<body>
无此用户,单击<a href="login.html">这里</a>返回,重新登录!
</body>
</html>
3.2.7 运行测试
http://localhost:8081/Study/jsp/exp05/content02/login.html
3.3 Servlet验证码登录功能。
验证码的主要目的是强制人机交互,抵御来自机器的自动化攻击,有效防止黑客对注册用户采用特定程序暴力破解方式不断进行登录尝试。验证码是将一串随机产生的数字生成一副图片,图片里加上一些干扰像素,由用户肉眼识别其中的验证码信息,输入表单提交验证,验证成功才能使用某功能。
任务描述:
在上一个登录实验的基础上增加验证码功能,图片信息由ImageServlet实现。
(1)准备好用户信息数据库,数据库名称为student,用户信息表为user;
(2)编写访问数据库类DBConn.java并将MySQL数据库所需jar文件复制到lib目录下,MySQL驱动jar文件为:mysql-connector-java-5.1.18-bin.jar,或其它版本也可;
(3)登录表单文件为log.jsp,带验证码功能,用户输入用户名、密码、验证码之后,将表单提交给LogimgServlet进行验证和数据库对比判断,如正确,则跳转到welcome.jsp页面,否则,跳转到logfail.jsp页面。
实验步骤:
本别编写ImageServlet.java、LogimgServlet.java、log.jsp、welcome.jsp、logfail.jsp等项目所需要的文件;
ImageServlet.java负责生成验证码图片,首先生成随机数字,在使用java.awt包中响应类将随机数绘制程图形象JSP页面输出,同时将生成的验证码保存在session中,供程序将其与用户输入的验证码对比验证。
BufferedImage是Image的子类,在Image基础上增加了缓存功能,即BufferedImage类生成的图片在内存里有一个缓冲区,利用这个缓冲区可以方便操作图片,通常进行图片属性修改,如大小变换、图片透明或不透明的设置等。
BufferedImage构造方法格式:
BufferedImage(int width, int height, int imageType)
width:生成图片的宽度;
height:生成图片的高度;
ImageType:生成图片。
LogimgServlet.java负责登录信息验证,接收表单提交的用户名、密码、验证码,用户名、密码与数据库对比验证,验证码则与session对象中验证码信息对比验证,全部验证正确,则跳到welcome.jsp页面,否则,跳转到logfail.jsp。
3.3.1 编写ImageServlet.java
%PROJECTROOT%/src/exp05/bean/ImageServlet.java
的内容如下:
package exp05.bean;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ImageServlet extends HttpServlet {
public ImageServlet() {
super();
}
@Override
public void destroy() {
super.destroy();
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
int width = 78;
int height = 20;
//创建对象
BufferedImage bim = new BufferedImage(68, 20, BufferedImage.TYPE_INT_RGB);
//获取图片对象bim的图形上下文对象g,这个g的功能如同一支绘图笔,程序中使用这支笔来
//绘制、修改图片对象bim。
Graphics g = bim.getGraphics();
Random rm = new Random();
g.setColor(new Color(rm.nextInt(100), 205, rm.nextInt(100)));
g.fillRect(0, 0, width, height);
StringBuffer sbf = new StringBuffer("");
//输出数字
for (int i = 0; i < 4; i++) {
g.setColor(Color.black);
g.setFont(new Font("华文隶书", Font.BOLD | Font.ITALIC, 22));
int n = rm.nextInt(10);
sbf.append(n);
g.drawString("" + n, i * 15 + 5, 18);
}
//生成的验证码保存到session中
HttpSession session = request.getSession(true);
session.setAttribute("piccode", sbf);
//禁止缓存
response.setHeader("Prama", "no-cache");
response.setHeader("Coche-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//将bim图片以“JPG”格式返回给浏览器。
ImageIO.write(bim, "JPG", response.getOutputStream());
response.getOutputStream().close();
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
@Override
public void init() throws ServletException {
}
}
3.3.2 编写LoginImgServlet.java
%PROJECTROOT%/src/exp05/bean/LoginImgServlet.java
的内容如下:
package exp05.bean;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginImgServlet extends HttpServlet {
public LoginImgServlet() {
super();
}
@Override
public void destroy() {
super.destroy();
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//解决post提交的中文乱码
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String checkcode = request.getParameter("checkcode");
String piccode = request.getSession().getAttribute("piccode").toString();
String userName = request.getParameter("userName");//
String passWord = request.getParameter("passWord");
//用户登录信息存入session
request.getSession().setAttribute("logInfo", userName + ";" + passWord + ";" + checkcode + ";" + piccode); //
String sql = "select * from user"; //
sql += " where loginname='" + userName + "' and password='" + passWord + "'";
Connection con = DBConn.getConnction();
Statement stmt;
ResultSet rs;
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next() & (checkcode.equals(piccode))) {//登录信息完全正确
request.getSession().setAttribute("userName", userName); //
response.sendRedirect("jsp/exp05/content03/welcome.jsp");
} else {//登录信息有误
response.sendRedirect("jsp/exp05/content03/logFail.jsp");//
}
} catch (SQLException e) {
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
@Override
public void init() throws ServletException {
}
}
3.3.3 编写web.xml
%WEBROOT%/WEB-INF/web.xml
的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>ShowParameterServlet</servlet-name>
<servlet-class>exp05.bean.ShowParameterServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>exp05.bean.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>exp05.bean.ImageServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginImgServlet</servlet-name>
<servlet-class>exp05.bean.LoginImgServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowParameterServlet</servlet-name>
<url-pattern>/ShowParameterServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/ImageServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginImgServlet</servlet-name>
<url-pattern>/LoginImgServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
3.3.4 编写log.jsp
%WEBROOT%/jsp/exp05/content03/log.jsp
的内容如下:
<%--
Document : log
Created on : 2018-10-6, 12:23:12
Author : Administrator
--%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<script type="text/javascript">
function reloadImage(t) {
t.src = "./ImageServlet?flag=" + Math.random();
}
</script>
<head> <base href="<%=basePath%>"> </head><!--定义了该文档的路径-->
<body> <center>
<form action="LoginImgServlet" method="post">
<table>
<tr><td colspan="2" align="center">用户登录</td></tr>
<tr><td>登录名:</td><td><input type="text" name="userName"></td></tr>
<tr><td>密 码:</td><td><input type="password" name="passWord"> </td></tr>
<tr><td>验证码</td>
<td><input type="text" name="checkcode">
<img src="./ImageServlet" align="middle" alt="看不清,点击这里!" onclick="reloadImage(this)"></td></tr>
<tr><td colspan="2" align="center">
<input type="submit" value="登录"></td></tr>
</table>
</form></center>
</body>
</html>
3.3.5 编写welcome.jsp参考代码如下:
%WEBROOT%/jsp/exp05/content03/welcome.jsp
的内容如下:
<%--
Document : welcome
Created on : 2018-10-6, 12:23:30
Author : Administrator
--%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>登录成功</title>
</head>
<body>
<font size="2" color="red">
<%
Date today = new Date();
int d = today.getDay();
int h = today.getHours();
String s = "";
if (h > 0 && h < 12) {
s = "上午好!";
} else if (h >= 12) {
s = "下午好!";
}
String day[] = {"日", "一", "二", "三", "四", "五", "六"};
out.println(s + " 今天是: 星期" + day[d]);
%></font><br>
<%=session.getAttribute("userName")%>,恭喜你,登录成功! <br>
</body>
</html>
3.3.6 编写logFail.jsp
%WEBROOT%/jsp/exp05/content03/logFail.jsp
的内容如下:
<%--
Document : loginFail
Created on : 2018-10-6, 12:23:51
Author : Administrator
--%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>logfail.jsp</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String logInfo = (String) session.getAttribute("logInfo");
%>
登录失败!登录信息:<%=logInfo%><p>
单击<a href="log.jsp">这里</a>返回,重新登录!
</body>
</html>
3.3.7 运行测试
http://localhost:8081/Study/jsp/exp05/content03/log.jsp
3.4 使用ServletConfig检索Servlet的初始化参数
任务描述:
在Servlet中读取web.xml中配置的参数。
3.4.1 编写ConfigServlet.java
%PROJECTROOT%/src/exp05/bean/ConfigServlet.java
的内容如下:
package exp05.bean;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ConfigServlet extends HttpServlet {
String driverClass = null;
String url = null;
String servletName = null;
ServletConfig config = null;
String email = null;
String tel = null;
@Override
public void init() {
ServletContext context = this.getServletContext();
driverClass = context.getInitParameter("driverClass");
url = context.getInitParameter("url");
config = getServletConfig();
servletName = config.getServletName();
email = config.getInitParameter("email");
tel = config.getInitParameter("tel");
}
@Override
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("通过ServletContext的对象获取上下文中参数:" + "<br>");
out.println("driverClass:" + driverClass + "<br>");
out.println("url:" + url + "<br>");
out.println("<br>");
out.println("通过ServletConfig的对象获取servlet中参数:" + "<br>");
out.println("Servlet名称:" + servletName + "<br>");
out.println("Email地址:" + email + "<br>");
out.println("电话:" + tel);
out.println("</body></html>");
}
}
3.4.2 编写 web.xml
%WEBROOT%/WEB-INF/web.xml
的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>ShowParameterServlet</servlet-name>
<servlet-class>exp05.bean.ShowParameterServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>exp05.bean.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>exp05.bean.ImageServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginImgServlet</servlet-name>
<servlet-class>exp05.bean.LoginImgServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowParameterServlet</servlet-name>
<url-pattern>/ShowParameterServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/ImageServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginImgServlet</servlet-name>
<url-pattern>/LoginImgServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<!-- exp05 - content04 start-->
<context-param>
<param-name>driverClass</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/db_user?useUnicode=true&characterEncoding=UTF-8</param-value>
</context-param>
<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>exp05.bean.ConfigServlet</servlet-class>
<init-param>
<param-name>email</param-name>
<param-value>tom@163.com</param-value>
</init-param>
<init-param>
<param-name>tel</param-name>
<param-value>8899123</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ConfigServlet</servlet-name>
<url-pattern>/ConfigServlet</url-pattern>
</servlet-mapping>
<!-- exp05 - content04 end-->
</web-app>
3.4.3 测试运行
http://localhost:8081/Study/ConfigServlet
4 思考题
- 结合本案例,理解“. /”、 “. ./”、“/”相对路径符号的含义
- 结合本案例理解Servlet工作流程。
5 实验总结
本实验实现了:
- JSP页面提交登录数据到Servlet,再由Servlet将结果返回给客户的过程;
- 登录数据提交到Servlet进行验证的功能;
- 由Servlet产生验证码,并对验证码及登录数据进行验证功能。