1 实验目的
- 掌握Servlet工作原理;
- 重点掌握Servlet设计要点;
- 在JSP中灵活运用Servlet。
2实验注意事项
3 实验任务与步骤
3.1 Servlet输出表单的全部数据项
3.1.1 创建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信息,
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
<!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配置文件
<?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 测试运行
3.2 用户登录验证功能
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
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
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
<!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
<%--
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
<%--
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 运行测试
3.3 Servlet验证码登录功能。
3.3.1 编写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
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
<?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
<%--
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参考代码如下:
<%--
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
<%--
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 运行测试
3.4 使用ServletConfig检索Servlet的初始化参数
3.4.1 编写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