1 实验目的

  1. 掌握Servlet工作原理;
  2. 重点掌握Servlet设计要点;
  3. 在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 >&nbsp;&nbsp;&nbsp;&nbsp;码:<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
10-06 12:49