MVC:
JSP + servlet + javabean
Java:
复习java基础知识
Jsp:
JSP、PHP、https://www.sodocs.net/doc/5010403413.html, 三门技术被称为Web 后端开发的3P 技术,其中JSP 依托J2EE 平台更是Web 开发领域的一枝独秀。学好JSP,是进入J2EE 企业开发的第一步。通过本阶段内容的学习,你将能够搭建JSP 的开发环境,了解JSP 的基本语法及内部对象的使用。Servlet:
Servlet 是Server Applet 的缩写,也称为服务端小程序。Servlet 技术一直处于不断的发展及进步之中,现在已经成为很多框架的技术基础,比如Spring、Struts2 等。通过本阶段课程的学习,你将了解Servlet的运行原理,Servlet 过滤器的知识并能编写出相对复杂的Java Web 程序。
Javabean:
JavaBeans是一个可重复使用的软件组件JavaBeans是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称beans。JSP页面应当将数据的处理过程指派给一个或几个beans来完成,我们只需在JSP页面中调用这个beans即可,从而有效的分离的静态工作部分和动态工作部分
JDBC:
JDBC 是Java 对关系型数据库进行访问的最主要的API,是Java 数据库编程的技术基础。通过本阶段内容的学习,你能够掌握数据库的基本知识及JDBC 技术的基本原理,并能够使用JDBC编写出对数据库进行增删改查的简单程序
Spring:
Spring 是一个开源框架,也是一个基于控制反转、依赖注入的轻量级容器,它的出现大大简化了传统的J2EE 开发模式。Spring 的主要优势之一就是其分层架构,该架构允许使用者自主选择任意件,同时为J2EE 应用程序开发提供集成框架。现在,Spring 已经成为J2EE 企业开发中的标准配置。
Struts2:
Spring MVC是一种基于Java的轻量级Web框架,它使用了MVC架构模式的思想,将web 层进行职责解耦,用来简化日常开发。Spring MVC 使用简单,学习成本低,很容易就写出性能优秀的程序。目前越来越多的项目选择使用Spring MVC 作为其Web开发框架。Hibernate:
Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC 进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate 可以应用在任何使用JDBC 的场合,既可以在Java 的客户端程序使用,也可以在Servlet/JSP 的Web 应用中使用,最具革命意义的是,Hibernate 可以在应用EJB 的J2EE 架构中取代CMP,完成数据持久化的重任。
初级准备:JDK、Tomcat(Web服务器)、MySQL(数据库)、JDBC(连接数据库)、Eclipse(软件)、设置环境变量*
Java:类,继承,实现,接口……
Jsp内置对象:request 对象、response 对象、session对象**、application对象、out
JDBC学习实例(先复习数据库):
一:利用MySQL Workbench访问数据库,并且创建表。
1.新建一个数据库jsp_db,并且设为默认数据库(set as default schema)。
2.创建表代码:
create table tbl_user(
id int(11) unsigned not null auto_increment,
name varchar(50) not null default'',
password varchar(50) not null default'',
email varchar(50) default'',
primary key(id))
engine=InnoDBdefault charset=utf8;
create table tbl_address(
id int(11) unsigned not null auto_increment,
city varchar(50) not null default'',
country varchar(50) not null default'',
user_id int(11)
unsigned not null, primary key(id))
engine=InnoDB default charset=utf8;
3.为表插入记录
insert into tbl_user(id,name,password,email)
values(1,'xiaoming','123456','xiaoming@https://www.sodocs.net/doc/5010403413.html,'),
(2,'xiaozhang','123456','xiaozhang@https://www.sodocs.net/doc/5010403413.html,');
insert into tbl_address(city,country,user_id) values ('beijing','china','1');
insert into tbl_address(city,country,user_id)values ('tianjin','china','2');
二:利用JDBC对数据库进行查询的操作。
1.将mysql-connector-java-5.1.25-bin.jar包。拷贝到WEB_INF目录下的lib文件夹下。
2.进入属性页面,选择Java Build Path,进入Libraries标签页。选择Add Jars。找到刚才拷贝进来的jar包,选择ok。既成功添加了JDBC的驱动程序。
3.创建一个类,在jdbc包下,命名为JDBCTest。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
publicclass JDBCTest {
publicstaticvoidmain(String[] args) {
String sql="SELECT*FROM tbl_user";
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.jdbc.Driver); [注册mysql的jdbc的驱动程序]
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db","root","1234");【获取mysql数据库链接,mysql数据库的url,用户名,密码】
st=conn.createStatement();
rs=st.executeQuery(sql);
while(rs.next()){
System.out.print(rs.getInt("id")+" ");
System.out.print(rs.getString("name")+" ");
System.out.print(rs.getString("password")+" ");
System.out.print(rs.getString("email")+" ");
System.out.println();}} 【遍历数据库内容】
catch (Exception e) { e.printStackTrace();}
finally{
try {rs.close();} catch (Exception e2) {}
try {rs.close();} catch (Exception e3) {}
try {rs.close();} catch (Exception e4) {}}
}}【清理】
三:利用JDBC对数据库进行插入更新以及删除工作
1.插入:
publicclass JDBCTest {
publicstatic Connection getConnection(){
Connection conn=null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db","root","1234");
}catch(Exception e){e.printStackTrace();}return conn;}【取得数据库连接】
publicstaticvoidinsert(){
Connection conn=getConnection();
try {String sql="INSERT INTO tbl_user(name,password,email)"+
"VALUES('Tom','123456','tom@https://www.sodocs.net/doc/5010403413.html,')";
Statement st=conn.createStatement();
intcount=st.executeUpdate(sql);【插入操作】
System.out.println("向用户表中插入了"+count+"条记录");
conn.close();} catch (Exception e) {e.printStackTrace();}}
publicstaticvoidmain(String[] args) {insert();}
2.更新:
String sql="UPDATE tbl_user SET email='tom@https://www.sodocs.net/doc/5010403413.html,' WHERE name='Tom'";【将sql语句改成】
3.删除:
String sql="DELETE FROM tbl_user WHERE name='Tom'";
4.事务处理:
事务就是一个完整的数据库操作。防止有的操作成功,有的操作失败而导致数据库数据出错误。新建一个Java类,在jdbc包下。输入代码:
import java.sql.Connection;import java.sql.DriverManager;
import java.sql.SQLException;import java.sql.Statement;
public class TransactionTest {
public static Connection getConnection(){
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db","root","1234");
} catch (Exception e) { e.printStackTrace();} return conn;}
public static void insertUserData(Connection conn) throws SQLException{
String sql="INSERT INTO tbl_user(id,name,password,email)"+
"VALUES('10','Tom','123456','tom@https://www.sodocs.net/doc/5010403413.html,')";
Statement st=conn.createStatement();
int count=st.executeUpdate(sql);
System.out.println("向用户表中插入了"+count+"条记录");}
public static void insertAddressData(Connection conn) throws SQLException{
String sql="INSERT INTO tbl_address(id,city,country,user_id)"+
"VALUES('1','shanghai','china','10')";
Statement st=conn.createStatement();
int count=st.executeUpdate(sql);
System.out.println("向地址表中插入了"+count+"条记录");}
public static void main(String[] args) {
Connection conn=null;
try { conn=getConnection();
conn.setAutoCommit(false);
insertUserData(conn);
insertAddressData(conn);
https://www.sodocs.net/doc/5010403413.html,mit();}
catch (Exception e) {System.out.println("=======捕获到SQL异常=======");e.printStackTrace();
try {conn.rollback();System.out.println("=======事物回滚成功=======");}
catch (Exception e2) {e2.printStackTrace();}
finally{try {if(conn!=null){conn.close();}} catch (Exception e3) {e3.printStackTrace();}}}}
}
5.程序优化1.0,数据库链接工厂类
(1)dbconfig.properties文件:
driver=com.mysql.jdbc.Driver
dburl=jdbc:mysql://localhost:3306/jsp_db
user=root
password=1234
(2)ConnectionFactory.java文件,在util包下。
package com.jikexueyuan.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
public class ConnectionFactory {
private static String driver;
private static String dburl;
private static String user;
private static String password;
private static final ConnectionFactory factory=new ConnectionFactory();
private Connection conn;
static{
Properties prop=new Properties();
try {
InputStream in=ConnectionFactory.class.getClassLoader()
.getResourceAsStream("dbconfig.properties");
prop.load(in);
} catch (Exception e) {
System.out.println("=======配置文件读取错误=======");
}
driver=prop.getProperty("driver");
dburl=prop.getProperty("dburl");
user=prop.getProperty("user");
password=prop.getProperty("password");
}
private ConnectionFactory(){}
public static ConnectionFactory getInstance(){return factory;}
public Connection makeConnection(){
try {Class.forName(driver);conn=DriverManager.getConnection(dburl,user,password);}
catch (Exception e) {e.printStackTrace(); }return conn;}}
(3)ConnectionFactoryTest.java文件,在test包下用来测试数据库链接类。
package com.jikexueyuan.test;
import java.sql.Connection;
import com.jikexueyuan.util.ConnectionFactory;
public class ConnectionFactoryTest {
public static void main(String[] args) throws Exception{
ConnectionFactory cf=ConnectionFactory.getInstance();
Connection conn=cf.makeConnection();
System.out.println(conn.getAutoCommit());}}
6.程序优化2.0,创建2个DTO类对应用户表和地址表:数据传输对象,用于远程调用。(1)在entity包下创建IdEntity类(所有实体类的父类)
package com.jikexueyuan.entity;
public abstract class IdEntity {
protected Long id;
public Long getId(){
return id;}
public void setId(Long id){
this.id=id;}}
(2)继承自IdEntity类的User类。用户信息的实体类。
package com.jikexueyuan.entity;
public class User extends IdEntity {
private String name;
private String password;
private String email;【成员变量】
右键选择source下的Generate Getters and Setters,自动生成以上对象的get和set方法
右键选择source下的Generate toString方法,继承id,自动生成toString方法}
(3)继承自IdEntity类的Address类。地址信息的实体类
package com.jikexueyuan.entity;
public class Address extends IdEntity{
private String city;
private String country;
private Long userId;【成员变量】
同样方法生成get,set和toString方法}
7.程序优化3.0。创建DAO类。数据访问对象,把数据库中的表转化为GTO类。
(1)在dao包下,创建一个UserDao接口
package com.jikexueyuan.dao;
import java.sql.SQLException;
import java.sql.Connection;
import https://www.sodocs.net/doc/5010403413.html,er;
public interface UserDao {
public void save(Connection conn,User user) throws SQLException;
public void update(Connection conn,Long id,User user) throws SQLException;
public void delete(Connection conn,User user) throws SQLException;}
(2)接口的实现:在dao包内创建com.jikexueyuan.dao.impl包,然后创建一个UserDaoImpl 类,接口为UserDao。分别将三个方法进行实现。
package com.jikexueyuan.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import https://www.sodocs.net/doc/5010403413.html,erDao;
import https://www.sodocs.net/doc/5010403413.html,er;
public class UserDaoImpl implements UserDao {
@Override【保存用户信息】
public void save(Connection conn, User user) throws SQLException {
PreparedStatementps=conn.prepareCall("INSERT INTO tbl_user(name,password,email)VALUE(?,?,?)");
ps.setString(1, user.getName());
ps.setString(2, user.getPassword());
ps.setString(3, user.getEmail());
ps.execute();}
@Override【更具用户指定的ID更新用户信息】
public void update(Connection conn, Long id, User user) throws SQLException {
String updatesql="UPDATE tbl_user SET name=?,password=?,email=? WHERE id=?";
PreparedStatement ps=conn.prepareStatement(updatesql);
ps.setString(1, user.getName());
ps.setString(2, user.getPassword());
ps.setString(3, user.getEmail());
ps.setLong(4,id);
ps.execute();}
@Override【删除指定用户信息】
public void delete(Connection conn, User user) throws SQLException {
PreparedStatement ps=conn.prepareStatement("DELETE FROM tbl_user WHERE id=?");
ps.setLong(1, user.getId());
ps.execute();}}
(3)创建测试类,在test包下创建UserDaoTest类
package com.jikexueyuan.test;
import java.sql.Connection;
import https://www.sodocs.net/doc/5010403413.html,erDao;
import https://www.sodocs.net/doc/5010403413.html,erDaoImpl;
import https://www.sodocs.net/doc/5010403413.html,er;
import com.jikexueyuan.util.ConnectionFactory;
public class UserDaoTest {
public static void main(String[] args) {
Connection conn=null;
try {
conn=ConnectionFactory.getInstance().makeConnection();
conn.setAutoCommit(false);
UserDao userDao=new UserDaoImpl();
User tom=new User();
tom.setName("Tom");
tom.setPassword("123456");
tom.setEmail("tom@https://www.sodocs.net/doc/5010403413.html,");
userDao.save(conn, tom);
https://www.sodocs.net/doc/5010403413.html,mit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception e2) {
e2.printStackTrace();}}}}
这里仅仅测试了User表的save方法,其他方法同样可以实现。
Servlet学习实例:一个登陆小程序
步骤一:
1.在servlet包下创建一个类LoginServlet,父类是HttpServlet
2.在编辑器中右键,选择source中的重写或实现方法(Override/Implement Methods),然后选择service方法参数如下,并且输入代码
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String userName=req.getParameter("uname");
String password=req.getParameter("upwd");
System.out.println("用户名==》"+userName);
System.out.println("密码==》"+password);
}
3.创建Jsp文件,输入代码:
4.在web.xml文件中配置URL
步骤二:在类中使用不同方法来实现登陆请求(doGet和doPost)
protectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("======进入doGet方法======");
doPost(req,resp);
}
protectedvoiddoPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("======进入doPost方法======");
String userName=req.getParameter("uname");
String password=req.getParameter("upwd");
System.out.println("用户名==》"+userName);
System.out.println("密码==》"+password);
}
步骤三(登陆判断):
1.创建success.jsp和error.jsp,分别写入代码:
登陆成功。
(error.jsp中将“成功”换成“失败”)
您提交的信息为:
用户名:<%=request.getParameter("uname") %>
密码:<%=request.getParameter("upwd") %>
2.修改LoginServlet.java的doPost方法中加入
if(userName.equals("darkmi")&&password.equals("jikexueyuan")){
resp.sendRedirect(req.getContextPath()+"/17/success.jsp");
}else{
resp.sendRedirect(req.getContextPath()+"/17/error.jsp");
}进行判断
3.servlet返回到success时不带有表单信息,所以页面显示null
步骤四(请求的转发和重定向):
1.在LoginServlet.java的doPost方法中修改
String forward=null;
if(userName.equals("darkmi")&&password.equals("jikexueyuan")){
【请求转发】
forward="/17/success.jsp";
RequestDispatcher rd=req.getRequestDispatcher(forward);
rd.forward(req, resp);
【请求重定向】
//resp.sendRedirect(req.getContextPath()+"/17/success.jsp");
}else{
【请求转发】
forward="/17/error.jsp";
RequestDispatcher rd=req.getRequestDispatcher(forward);
rd.forward(req, resp);
【请求重定向】
//resp.sendRedirect(req.getContextPath()+"/17/error.jsp");
}
2.过程注意事项,只有一次请求,而且只能转发给同一应用的地址。但是重定向可以实现步骤五:根据数据库中的信息进行判断。
1.在之前JDBC练习所建立的UserDao.java接口中加入
public ResultSet get(Connection conn,User user) throws SQLException;接口
2.在UserDaoImpl.java类中添加实现方法
public ResultSet get(Connection conn, User user) throws SQLException {
PreparedStatement ps=conn.prepareStatement("SELECT*FROM tbl_user WHERE name=? AND password=?");
ps.setString(1, user.getName());
ps.setString(2, user.getPassword());
return ps.executeQuery();}
3.在com.jikexueyuan.service包下创建一个ChackUserService.java类,编写check逻辑。输入代码:
package com.jikexueyuan.service;
import java.sql.Connection;
import java.sql.ResultSet;
import https://www.sodocs.net/doc/5010403413.html,erDao;
import https://www.sodocs.net/doc/5010403413.html,erDaoImpl;
import https://www.sodocs.net/doc/5010403413.html,er;
import com.jikexueyuan.util.ConnectionFactory;
public class ChackUserService {
private UserDao userDao=new UserDaoImpl();
public boolean check(User user){
Connection conn=null;
conn=ConnectionFactory.getInstance().makeConnection();
conn.setAutoCommit(false);
ResultSet resultSet=userDao.get(conn, user);
while(resultSet.next()){
return true;
}
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (Exception e2) {
e2.printStackTrace();
}
}finally{
try {
conn.close();
} catch (Exception e3) {
e3.printStackTrace();
}
}
return false;}}
步骤六:完善业务逻辑层代码
1.在servlet包下创建一个servlet,命名为ChackServlet,在doGet方法中直接调用doPost方法:doPost(request,response);
在doPost方法中实现业务逻辑:
String uname=request.getParameter("uname");
String passwd=request.getParameter("upwd");
RequestDispatcher rd=null;
String forward=null;
if(uname==null||passwd==null){
request.setAttribute("msg", "用户名或者密码为空!");
rd=request.getRequestDispatcher("/17/error.jsp");
rd.forward(request, response);
}else{
User user=new User();
user.setName(uname);
user.setPassword(passwd);
boolean bool=cku.check(user);
if(bool){
forward="/17/success.jsp";
}else{
request.setAttribute("msg", "用户名或者密码输入错误,请重新输入!");
forward="/17/error.jsp";
rd=request.getRequestDispatcher(forward);
rd.forward(request,response);
}
还要加上private ChackUserService cku=new ChackUserService();调用上面步骤编写的类。
2.在web.xml文件中配置
步骤七:编写前端jsp文件,完成
1.login.jsp
样式:
body{
color:#000;
font-size:14px;
margin:20px auto;}
校验函数:
function check(form){
if(document.forms.loginForm.uname.value==""){
alert("请输入用户名!");
document.forms.loginForm.uname.focus();
return false;}
if(document.forms.loginForm.upwd.value==""){
alert("请输入密码!");
document.forms.loginForm.upwd.focus();
return false;}}
body内:
2.error.jsp,先加入css到前端。然后body内:
登陆失败。
错误提示:<%Object obj=request.getAttribute("msg");
if(obj!=null){out.println(obj.toString());}else{out.println("无");}%>
您提交的信息为:
用户名:<%=request.getParameter("uname") %>
密码:<%=request.getParameter("upwd") %>
3.success.jsp,先加入样式表,然后在body体中填写如下代码:
Servlet学习实例二:servlet过滤器
在源数据和目的数据之间进行过滤
课程一:新建一个过滤器,简单了解功能。
1.在src目录下选择新建一个Filter文件,在filter包下新建一个FilterOne过滤器。将其中的方法中加入日志信息
public FilterOne() { System.out.println("=======构造函数=======");}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("=======初始化方法=======");
String initParam=fConfig.getInitParameter("param");
System.out.println("param=="+initParam);}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("=======开始执行doFilter方法=======");
chain.doFilter(request, response);
System.out.println("=======结束执行doFilter方法=======");}
public void destroy() {System.out.println("=======销毁方法=======");}
2.配置xml
课程二:过滤器链,过滤器链的执行顺序就按照部署描述符中的注册信息的先后来执行
课程三:过滤器实例一:利用过滤器解决提交中文信息时,返回乱码的情况
1.首先,新建一个过滤器,并且声明一个成员变量:
private String charEncoding=null;
2.然后编写init方法的实现:
charEncoding=fConfig.getInitParameter(“encoding”);
if(charEncoding==null){throw new ServletException(“EncodingFilter中的编码设置为空!!”);}
3.再编写doFilter方法中的业务逻辑
if(!charEncoding.equals(request.getCharacteEncoding())){
request.setCharacterEncoding(charEncoding)
}response.setCharacterEncoding(charEncoding);
Chain.doFilter(request,response);
4.最后编写部署描述符的设置
课程四:过滤器实例二,权限校验。
1.hello.jsp
login.jsp,这两个文件之前都创建过。直接拷贝。记得要修改一下login.jsp中提交到servlet 的代码(因为要创建新的servlet业务逻辑)。
index.jsp文件代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
首页
<%
String flag="";
Object obj=session.getAttribute("flag");
if(obj!=null){
flag=obj.toString();}
if(flag.equals("login_success")){
%>退出
<%}else{%>登录<%}%>
2.建立一个LoginServlet18.java,要对应login.jsp中的代码,写入代码为:
package com.jikexueyuan.servlet;
import java.io.IOException;
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 https://www.sodocs.net/doc/5010403413.html,er;
import com.jikexueyuan.service.ChackUserService;
public class LoginServlet18 extends HttpServlet {
private static final long serialVersionUID = 1L;
private ChackUserService cku=new ChackUserService();
public LoginServlet18() { super(); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);
response.getWriter().append("Served at: ").append(request.getContextPath());}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uname=request.getParameter("uname");
String passwd=request.getParameter("upwd");
String returnUri=request.getParameter("return_uri");
System.out.println("用户名==》"+uname);
System.out.println("密码==》"+passwd);
System.out.println("return uri==》"+returnUri);
RequestDispatcher rd=null;
if(uname==null||passwd==null){
request.setAttribute("msg", "用户名或者密码为空!");
rd=request.getRequestDispatcher("/18/login.jsp");
rd.forward(request, response);
}else{
User user=new User();
user.setName(uname);
user.setPassword(passwd);
boolean bool=cku.check(user);
if(bool){
request.getSession().setAttribute("flag", "login_success");
if(returnUri!=null){
rd=request.getRequestDispatcher("returnUri");
rd.forward(request, response);
}else{
rd=request.getRequestDispatcher("/18/index.jsp");
rd.forward(request, response);
}
}else{
request.getSession().setAttribute("flag", "login_error");
request.setAttribute("msg", "用户名或者密码输入错误,请重新输入!");
rd=request.getRequestDispatcher("/18/login.jsp");
rd.forward(request, response);
}
}
}}
LogoutServlet.java代码:
package com.jikexueyuan.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LogoutServlet18 extends HttpServlet {
private static final long serialVersionUID = 1L;
public LogoutServlet18() { super();}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.getSession().invalidate();
response.sendRedirect(request.getContextPath()+"/18/index.jsp");}}
web.xml部署描述符
3.新建一个ParmissionFilter.java,在doFilter方法中添加代码。HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
String servletPath=req.getServletPath();
HttpSession session=req.getSession();
String flag=(String)session.getAttribute("flag");
if(servletPath!=null&&(servletPath.equals("/18/index.jsp"))||(servletPath.equals("/LoginServlet18"))) {chain.doFilter(request, response);
}else{
if(flag!=null&&flag.equals("login_success")){
chain.doFilter(request, response);
}else if(flag!=null&&flag.equals("login_error")){
req.setAttribute("msg", "登录失败,请重新登陆!!!
");
req.setAttribute("return_uri", servletPath);
RequestDispatcher rd=req.getRequestDispatcher("/17/login.jsp");
rd.forward(req, resp);
}else{
req.setAttribute("msg", "您尚未登录!!!");
req.setAttribute("return_uri", servletPath);
RequestDispatcher rd=req.getRequestDispatcher("/17/login.jsp");
rd.forward(req, resp);
}}
在web.xml中配置信息