要求:
1、使用MVC(JavaBean + JSP + Servlet)模式实现实验三的功能,具体要求如下:
(1) login.jsp:登录页面(假定合法的用户名均以“ahpu_”开头,密码均为“123”),其提交到名为LoginServlet的Servlet。
(2) 在LoginServlet中检查用户名和密码,若合法则转发到messageBoard.jsp。
(3) messageBoard.jsp:留言板页面,其提交到名为MessageServlet的Servlet。
(4) 在MessageServlet中将留言信息对应的Message对象加入application,并转发到showMessage.jsp。
(5) showMessage.jsp:留言列表页面,其以表格呈现application中所有的留言。
(6) 编写名为LoginChecker的过滤器(Filter)实现“若未经过登录,则禁止访问除login.jsp和LoginServlet之外的所有URL”的功能。
web.xml(配置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_4_0.xsd"
version="4.0">
<!--login Servlet-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!--message servlet-->
<servlet>
<servlet-name>MessageServlet</servlet-name>
<servlet-class>servlet.MessageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MessageServlet</servlet-name>
<url-pattern>/Message</url-pattern>
</servlet-mapping>
<!--filter 配置信息-->
<filter>
<filter-name>loginChecker</filter-name>
<filter-class>filter.LoginChecker</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</init-param>
<init-param>
<param-name>LoginServlet</param-name>
<param-value>/login</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginChecker</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Message.java
package bean;
/**
* @Author: WQ
* @Date: 2019/4/28 15:23
* @Version
*/
public class Message {
private String who;
private String title;
private String content;
private String when;
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content.replace("<", "<").replace(">", ">").replace("\"", """);
}
public String getWhen() {
return when;
}
public void setWhen(String when) {
this.when = when;
}
}
login.jsp
<%--
Created by IntelliJ IDEA.
User: 19855
Date: 2019/4/28
Time: 15:05
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
<title>登录</title>
</head>
<body class="container mt-3">
<!-- 显示登录错误信息 -->
<%
String err = (String)request.getAttribute("LOGIN_ERR");
if(err != null) {
out.write("<div class='alert alert-danger'>" + err + "</div>");
}
%>
<form action="login" method="post">
<div class="card border-success">
<div class="card-header bg-success">登录信息</div>
<div class="card-body">
<div class="form-group">
<label>用户名</label>
<input type="text" class="form-control" name="username"/>
</div>
<div class="form-group">
<label>密码</label>
<input type="password" class="form-control" name="password"/>
</div>
</div>
<div class="card-footer">
<input type="submit" class="btn btn-primary float-right" value="登录" />
<input type="reset" class="btn btn-danger float-right mr-3" value="重置" />
</div>
</div>
</form>
</body>
</html>
LoginServlet.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Author: WQ
* @Date: 2019/4/28 15:07
* @Version
*/
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
String psw = request.getParameter("password");
boolean success = false; // 登录是否成功
HttpSession session = request.getSession();
if (name == null || !name.startsWith("ahpu_") || name.length() < 6 || name.length() > 12) {
request.setAttribute("LOGIN_ERR", "用户名格式错误");
} else if (!"123".equals(psw)) {
request.setAttribute("LOGIN_ERR", "密码错误");
} else {
success = true;
}
if (!success) {
request.getRequestDispatcher("login.jsp").forward(request, response); // 转发到登录界面
} else {
session.setAttribute("LOGIN_USER", name); // 保存用户名到session
request.getRequestDispatcher("messageBoard.jsp").forward(request,response);
}
}
}
messageBoard.jsp
<%--
Created by IntelliJ IDEA.
User: 19855
Date: 2019/4/28
Time: 15:18
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
<title>编辑留言</title>
</head>
<body class="container mt-3">
<form method="post" action="Message">
<div class="card border-primary">
<div class="card-header bg-primary">编辑留言</div>
<div class="card-body">
<div class="form-group">
<label>标题</label>
<input type="text" class="form-control" name="title"/>
</div>
<div class="form-group">
<label>内容</label>
<textarea class="form-control" name="content"></textarea>
</div>
</div>
<div class="card-footer">
<input type="submit" class="btn btn-primary float-right" value="提交" />
</div>
</div>
</form>
</body>
</html>
MessageServlet.java
package servlet;
import bean.Message;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Author: WQ
* @Date: 2019/4/28 15:22
* @Version
*/
public class MessageServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
ServletContext application = request.getServletContext();
String title = request.getParameter("title");
String content = request.getParameter("content");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(new Date());
if (title == null || title.trim().length() < 1 || content == null || content.trim().length() < 1) {
out.write("<div class='alert alert-danger'>请输入留言的标题和内容</div>");
return;
}
Message m = new Message();
m.setWho((String)session.getAttribute("LOGIN_USER"));
m.setTitle(title.trim());
m.setContent(content.trim());
m.setWhen(time);
List<Message> msgs = (List<Message>)application.getAttribute("MSGS");
if(msgs == null) { // 首次进入此页面时成立
msgs = new ArrayList<Message>();
application.setAttribute("MSGS", msgs);
}
msgs.add(m); // 留言信息加入application
response.sendRedirect("showMessage.jsp");//重定向到showMessage.jsp页面
}
}
showMessage.jsp
<%--
Created by IntelliJ IDEA.
User: 19855
Date: 2019/4/28
Time: 15:27
To change this template use File | Settings | File Templates.
--%>
<%@page import="bean.Message"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
<title>留言列表</title>
</head>
<body class="container mt-3">
<%
List<Message> msgs = (List<Message>)application.getAttribute("MSGS");
%>
<div class="card border-info">
<div class="card-header bg-info">留言列表</div>
<div class="card-body">
<table class="table table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Message from</th>
<th scope="col">title</th>
<th scope="col">content</th>
<th scope="col">time</th>
</tr>
</thead>
<tbody>
<%
int i = 0;
for(Message msg : msgs){
out.write("<tr>");
out.write("<td>" + (++i) + "</td>");
out.write("<td>" + msg.getWho() + "</td>");
out.write("<td>" + msg.getTitle() + "</td>");
out.write("<td>" + msg.getContent() + "</td>");
out.write("<td>" + msg.getWhen() + "</td>");
out.write("</tr>");
}
%>
</tbody>
</table>
</div>
</div>
</body>
</html>
LoginChecker.java(过滤器)
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Author: WQ
* @Date: 2019/4/28 15:29
* @Version
*/
public class LoginChecker implements Filter {
//FilterConfig可用于访问filter的配置信息
private FilterConfig config;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException {
//获取Filter的配置参数
String encoding = config.getInitParameter("encoding");
String loginPage = config.getInitParameter("loginPage");
String loginServlet = config.getInitParameter("LoginServlet");
HttpSession session = ((HttpServletRequest)request).getSession();
//设置request编码用的字符集
request.setCharacterEncoding(encoding);
String requestPath = ((HttpServletRequest)request).getServletPath();//获取用户请求地址
if(session.getAttribute("LOGIN_USER") == null
&& !requestPath.endsWith(loginPage)
&& !requestPath.endsWith(loginServlet)
&& !requestPath.endsWith("index")){
request.getRequestDispatcher(loginPage).forward(request,response);
}else{
fc.doFilter(request,response);//放行
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {this.config = filterConfig;}
@Override
public void destroy() {this.config = null;}
}