J2EE实验报告,Servlet编程实验,适用于「清华大学出版社」出版的的「JSP实用教程」,高等学校JAVA课程系列教材。JSPjava代码和特定的更改内容嵌入到静态页面中,以静态页面为模板,实现部分内容的动态生成。JSP引入了一个名为“JSP操作”的XML标记来调用内置函数。

实验目的

掌握编写Servlet常用对象,包括:HttpServletRequest、HttpServletResponse、RequestDispatche和ServletContext。

实验内容

编写servlet类,程序功能如下:

  • 用户在登录页面输入用户名和密码,点击登录按钮后,则请求servlet程序验证用户名和密码;
    • 如果用户名为admin且密码为12345,则执行welcomeServlet;否则,给用户输出提示信息:”对不起,username or password error!”,同时,返回到登录页面。
    • 使用RequestDispatche的forward和include方法实现。

实验步骤

在前面实验中已经创建并部署的Web项目FristTomcatProject中进行编程。

3.1 编写登陆页面login.jsp

3.2 编写servlet类DispatcherServlet.java

  • 使用RequestDispatche的forward和include方法实现DispatcherServlet类。DispatcherServlet接收登录页面的用户名和密码。
    • 如果用户名为admin且密码为12345,则使用forward方法重定向到welcomeServlet
    • 如果用户名不是admin,则输出“Sorry,用户名或密码错误,请重新输入!”,并且使用include方法返回登录页面login.jsp.
  • 配置DispatcherServlet类。

3.3 编写servlet类welcomeServlet.java

  1. 该类在页面显示“Welcome, 用户名”的字符串,其中,“用户名”是login.jsp发送的用户名。
  2. 配置welcomeServlet类。

3.4 运行程序

  • 启动服务器,使用浏览器访问login.jsp
  • 输入用户名admin、密码12345。点击login按钮
  • 观察登录页面form使用get方法时,登录后浏览器地址的变化。
  • 再次使用浏览器访问login.jsp,输入不是admin的用户名。

3.5 修改login.jsp中form的方法为post

修改代码后,再重新测试程序,观察浏览器地址栏地址的变化。

4 源代码

4.1 login.jsp

//login.jsp
<%--
  Created by IntelliJ IDEA.
  User: 贰叁伍
  Date: 2022/4/26
  Time: 20:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/environment/DispatcherServlet" method="post">
    <table>
    <tbody>
    <tr>
        <td align="right">用户名:</td>
        <td><input type="text" name="name"></td>
    </tr>
    <tr>
        <td align="right">密码:</td>
        <td><input type="password" name="password"></td>
    </tr>
    <tr>
        <td align="center" colspan="2">
            <input type="submit" value="登录">
            <input type="reset" value="重置">
        </td>
    </tr>
    </tbody>
    </table>
</form>
</body>
</html>

4.2 welcomeServlet.java

//welcomeServlet.java
package com.example.java;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "welcomeServlet", value = "/welcomeServlet")
public class welcomeServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        out.print("Welcome," + name + "用户登录");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        out.print("Welcome," + name + "用户登录");
    }
}

4.3 DispatcherServlet.java

//DispatcherServlet.java
package com.example.java;

import javax.servlet.*;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "DispatcherServlet", value = "/DispatcherServlet")
public class DispatcherServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        if(name.equals("admin") && password.equals("123456")){//比对用户名和密码 相符就跳转
            RequestDispatcher rd = req.getRequestDispatcher("/welcomeServlet");
            rd.forward(req, resp);
        }
        else
        {
            out.print("“Sorry,用户名或密码错误,请重新输入!");
            RequestDispatcher rd = req.getRequestDispatcher("/SecondTest/login.jsp");
            rd.include(req, resp);
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        if(name.equals("admin") && password.equals("123456")){//比对用户名和密码 相符就跳转
            RequestDispatcher rd = req.getRequestDispatcher("/welcomeServlet");
            rd.forward(req, resp);
        }
        else
        {
            out.print("“Sorry,用户名或密码错误,请重新输入!");
            RequestDispatcher rd = req.getRequestDispatcher("/SecondTest/login.jsp");
            rd.include(req, resp);
        }
    }
}

5 测试结果

Java企业级应用开发(J2EE)_实验四Servlet编程插图1
登录页面
Java企业级应用开发(J2EE)_实验四Servlet编程插图2
登录成功
Java企业级应用开发(J2EE)_实验四Servlet编程插图3
登录失败

6 实验中的问题及解决方案

  • 无法访问Servlet,返回404
    • 在对应的Java文件中添加@WebServlet(name = “*”, value = “*”)
  • doGet方法时,页面乱码
    • 添加ContentType即:resp.setContentType(“text/html;charset=utf-8”);即可解决
  • getRequestDispatcher时无法获取正确的路径
    • 添加”/”或者使用绝对路径