互联网软件开发—— 实验五 Servlet 的应用(留言板,过滤器禁止用户通过浏览器地址栏直接访问)

实验名称: 实验五 Servlet 的应用

一、实验目的:

1、掌握Servlet和Filter的概念、生命周期、编写以及配置方法。
2、理解MVC模式的组成、工作原理以及优点。
3、掌握在Servlet中访问JSP内置对象并转发页面的方法。

二、实验内容和要求:

参照实验三,使用MVC(JavaBean + JSP + Servlet)模式实现如下功能:
1、login.jsp:登录页面,登录表单提交到名为LoginServlet的Servlet。
2、在LoginServlet中检查用户名和密码,若合法(假定合法的用户名均以
“ahpu_”开头,密码均为“123”)则转发到messageBoard.jsp。
3、messageBoard.jsp:留言板页面,留言表单提交到名为MessageServlet的
Servlet。
4、在MessageServlet中,将留言信息对应的Message对象加入application,并
转发到showMessage.jsp,要求支持多次留言。
5、showMessage.jsp:留言列表页面,其以表格呈现application中所有的留言,
添加超链接(继续留言)实现再次留言。
6、编写名为Myfilter的过滤器(Filter),实现功能:若未经过登录,则禁
止访问除login.jsp和LoginServlet之外的所有URL。
7、要求分别用web.xml配置注解(@WebServlet)两种方式部署Servlet。

三、实验步骤

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
	<style> 
	input[type=button], input[type=submit], input[type=reset] {
	  background-color: #4CAF50;
	  border: none;
	  color: white;
	  padding: 6px 16px;
	  text-decoration: none;
	  margin: 6px  2px 0px;
	  cursor: pointer;
	}
	input[type=text] ,input[type=password]{
	  width:60%;
	  padding: 8px 8px;
	  margin: 6px 2px;
	  box-sizing: border-box;
	  border: none;
	  background-color: #C0C0C0;
	  color: white;
	}
	div {
 	width: 30%;
  border:2px solid green;
  background-color: #f2f2f2;
  padding: 10px;
 
}
</style>
  </head>
  
  <body>
  <div>
<form action="LoginServlet" method="post">
 用户名:<input type="text" name="username"><br>&nbsp;&nbsp;令:<input type="password" name="password"><br>
 <input type="submit" value="登录">
 <input type="reset" value="重置">
</form>
	</div>
</body>
</html>

LoginServlet

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
@WebServlet("/LoginServlet")  //注解方式
public class LoginServlet extends HttpServlet {

	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name=request.getParameter("username");
		String pass=request.getParameter("password");
		HttpSession session = request.getSession();
		if(name.startsWith("ahpu_") && name.length()>=6 && name.length()<=12 && pass.equals("123")){
			session.setAttribute("username", name);//用户名存入application,其它页面取出
			response.sendRedirect("messageBoard.jsp");
		}
		else{
			response.setContentType("text/html;charset=utf8");//将浏览器编码设置为utf-8
			/*传输数据时,write,print都可以使用
			write():仅支持输出字符类型数据,字符、字符数组、字符串等
            print():可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,
                      这些字节都通过write(int c)方法被输出 
            */
			PrintWriter out = response.getWriter();
			out.print("用户名或者密码错误!");//servlet页面输出文字,myeclipse自带浏览器会乱码
			
		}
	}
}


messageBoard.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<html>
</head>
<style>

input[type=text], select {
  width: 95%;
  padding: 12px 20px;
  margin: 8px 0;
  display: inline-block;
  border: 1px solid #ccc;
  border-radius: 4px;
  box-sizing: border-box;
}

input[type=submit] {
  width: 20%;
  background-color: #4CAF50;
  color: white;
  padding: 14px 20px;
  margin: 8px 0;

  border: none;
  border-radius: 4px;
  cursor: pointer;
}

input[type=submit]:hover {
  background-color: #45a049;
}

div {
 width: 60%;
  border:2px solid green;
  background-color: #f2f2f2;
  padding: 40px;
  border-radius:25px;
}
</style>
<body>
<%
	if(session.getAttribute("username") == null )//未登录用户,返回登录界面
		response.sendRedirect("login.jsp");
%>
<div>
	<form action="messageBoard" method="post">
		标题:<br>
		<input type="text" name="title" placeholder="请填写标题"><br>
		内容	:<br>
		<textarea name="content" rows="5" cols="73"></textarea><br>
		<input style="float:right"   type="submit" value="提交">
	</form>
</div>
</body>
</html>

MessageServlet

package servlet;
import javabean.Message;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet("/MessageServlet")  //注解方式
public class MessageServlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession session = request.getSession();//在java servlet中使用session
		ServletContext application = this.getServletContext();//在java servlet中使用application
		
		request.setCharacterEncoding("utf-8");
		//获取Messagae对象的属性
		String title=request.getParameter("title");//request获取title属性的值
		String content=request.getParameter("content");//request获取content属性的值
		String name=session.getAttribute("username").toString();
		//把一个 Number 对象转换为一个字符串,并返回结果,session中获取session的值
		Date createTime= new Date();//系统获取时间
		
		Message message=new Message();
		//调用Message属性的set方法,将上面获得的值传入
		message.setName(name);
		message.setTitle(title);
		message.setContent(content);
		message.setCreateTime(createTime);
		
		List<Message> list=(List<Message>)application.getAttribute("messagelist");
		//创建类型为Message的集合,将application中获得的messagelist传入list中,
		//没有messagelist时,传入list的值为null
		if(list==null) //说明还没有留言
			list=new ArrayList<Message>();
		list.add(message);
		application.setAttribute("messagelist", list); //将list存入application	
		response.sendRedirect("showMessage.jsp");//重定向
	}
}

showMessage.jsp
利用for循环和html表格,将内容输出

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="javabean.Mytools"%>
<%@page import="java.util.List"%>
<%@page import="javabean.Message"%>
<html>
	<head>
		<style>
		table 
		{
    		border-collapse: collapse;
    		width:70%;
		}
		table, td, th
		{
			border:2px solid black;
		}
		th
		{
			background-color:green;
			color:white;
			height:35px;
			
		}
		td{
			text-align:center;
			vertical-align:center;
			height:30px;
			background-color:#C0C0C0;
		}
		
		</style>
	</head>
<body>

<%
List<Message> list=(List<Message>)application.getAttribute("messagelist"); //取出留言list
%>
<table >
	<tr>
		<th> # </th>
		<th>用户</th>
		<th>标题</th>
		<th>内容</th>
		<th>编辑日期</th>
	</tr>
	<%
	for(int i=0;i<list.size();i++){
		Message message=list.get(i);
	
	 %>
	 
	 <tr>
		<td><%=i+1 %></td>
		<td><%=message.getName() %></td>
		<td><%=Mytools.change(message.getTitle()) %></td>
		<td><%=Mytools.change(message.getContent()) %></td>
		<td><%=message.getCreateTime().toLocaleString() %></td>
	</tr>
	
	<%} %>
</table>
<a href="messageBoard.jsp">继续留言</a>
</body>
</html>

Mytools.java
工具类,将转义字符替换

package javabean;

public class Mytools {
		public static String change(String str){
			str=str.replace("<","&lt;");
			str=str.replace(">","&gt;");
			str=str.replace("&","&amp;");
			str=str.replace("'","&apos;");
			str=str.replace("\"","&quot;");
			//转义字符
			return str;
		}	
}

Message.java

package javabean;

import java.util.Date;

public class Message {
	private String name;
	private String title;
	private String content;
	private Date  createTime;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	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;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	
	
}

MyFilter过滤器

package servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter("/*") 
public class MyFilter implements Filter{
	@Override
	public void destroy() {
		// 销毁时调用
	}
	/*public void doFilter(ServletRequest arg0, ServletResponse arg1,
	FilterChain arg2) throws IOException, ServletException {
	将arg0,arg1,arg1参数重命名为req,res,chain方便使用
	*/
	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		//不能直接命名为request使用,Fliter提供的是ServletRequest,ServletResponse类型的request和response
		//需要强制转换为HttpServletRequest,HttpServletResponse,否者没有getSession,sendRedirect等方法
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response=(HttpServletResponse) res;
		HttpSession session = request.getSession();
		
		String path=request.getRequestURI();// 得到请求的路径
		//如果路径以"login.jsp"结尾或者内容是LoginServlet
		if(path.endsWith("login.jsp") || path.contains("LoginServlet"))
			chain.doFilter(request, response);//放行函数chain
		else if(session.getAttribute("username")!=null)
			chain.doFilter(request, response);///交给下一个过滤器或servlet处理
		else 
			response.sendRedirect("login.jsp");	
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		//初始化方法  接收一个FilterConfig类型的参数 该参数是对Filter的一些配置
	}
}

四、运行结果

Case1:密码输入错误
在这里插入图片描述

跳转到LoginServlet,输入错误信息
在这里插入图片描述

Case2:直接访问showMessage,messageBoard界面
直接跳转回登录的界面

在这里插入图片描述

Case:登录成功,填写留言板
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、思考题:

1、对于Tomcat,如何做到“只能通过Servlet转发的方式访问某个JSP页面, 即如何禁止用户通过浏览器地址栏直接访问该页面”?
①通过在禁止直接访问的页面里面添加登录检查,检查session是否有用户
<%
if(session.getAttribute(“username”) == null )//未登录用户,返回登录界面
response.sendRedirect(“login.jsp”);
%>
②添加过滤器,对于不需要拦截 的页面chain放行
if(path.endsWith(“login.jsp”) || path.contains(“LoginServlet”))
chain.doFilter(request, response);//放行函数chain
else if(session.getAttribute(“username”)!=null)
chain.doFilter(request, response);///交给下一个过滤器或servlet处理
else
response.sendRedirect(“login.jsp”);
2、简述 MVC 模式的组成,其相对于纯 JSP、JSP+JavaBean 的开发方式分别 有何优点?
优点:
1.有利于代码复用
2.有利于人员分工
3.降低了程序模块之间的耦合,便于程序的维护和扩展。

  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值