基于SSH框架实现树形结构页面还原以及简单的登录功能

基于SSH框架实现树形结构页面还原以及简单的登录功能(没有注册功能),基于数据库设计表存储结构,该存储结构能够通用,改变树形的内容(如换成公司人员组成树)也可以存储

前言

在前面找工作面试时,一家公司给出的机试题.由于没有用过SSH,只好查找各种资料搭建了一个SSH框架按照要求实现了一非常简单的登录功能,以及题目要求的树形结构的还原.
----由于经验缺乏,技术不足. 有不对的地方还请大家多多指点,谢谢!

一、什么是SSH框架

SSH是 (struts+spring+hibernate) 的一个集成框架,是一种Web应用程序开源框架。

SSH有SSH1和SSH2两种,本文使用的是SSH2。

二、Struts+Spring+Hibernate 各个作用

Strtus: 基于MVC设计模式,可以使我们的逻辑变得清晰
Spring: IOC和AOP可以使我们的程序最大限度上解耦合
Hibernate: 持久层框架,操作数据库

三、开发环境

Eclipse + PowerDesigner + Navicat + MySql + JDK 1.8 + Tomcat 8.5

四、数据库设计

(根据要求使用PowerDesigner简单设计两张表)
1. 用户表:
在这里插入图片描述
在这里插入图片描述
建表语句:

drop table if exists sys_user;

/*==============================================================*/
/* Table: sys_user                                              */
/*==============================================================*/
create table sys_user
(
   user_id              varchar(32) not null comment '用户id',
   user_name            varchar(32) not null comment '用户名',
   user_password        varchar(32) not null comment '登录密码',
   create_time          char(14) comment '创建时间',
   update_time          char(14) comment '更新时间',
   primary key (user_id)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

alter table sys_user comment '用户表';

插入数据:

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES ('001', 'admin', '123', '20190325000000', '20190325000000');

*用户表密码应当加密存储

2. 树形结构表:
在这里插入图片描述
在这里插入图片描述
建表语句:

drop table if exists tree_list;

/*==============================================================*/
/* Table: tree_list                                             */
/*==============================================================*/
create table tree_list
(
   tree_id              varchar(32) not null comment '树形结构_id',
   tree_name            varchar(32) not null comment '树形结构_名称',
   tree_code            varchar(32) not null comment '树形结构_编号(根据实际业务,比如保存城市信息,这个此段可以存储城市的邮编或者地区号)',
   tree_parent_id       varchar(32) not null comment '树形结构_父类id',
   primary key (tree_id)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

alter table tree_list comment '树形结构表';

插入数据:

-- ----------------------------
-- Records of tree_list
-- ----------------------------
INSERT INTO `tree_list` VALUES ('001', '中国', '0086', '1');
INSERT INTO `tree_list` VALUES ('002', '北京', '100000', '001');
INSERT INTO `tree_list` VALUES ('003', '上海', '200000', '001');
INSERT INTO `tree_list` VALUES ('004', '天津', '300000', '001');
INSERT INTO `tree_list` VALUES ('005', '大兴', '102600', '002');
INSERT INTO `tree_list` VALUES ('006', '房山', '102400', '002');
INSERT INTO `tree_list` VALUES ('007', '黄浦', '200001', '003');
INSERT INTO `tree_list` VALUES ('008', '宝山', '201900', '003');
INSERT INTO `tree_list` VALUES ('009', '武清', '301700', '004');
INSERT INTO `tree_list` VALUES ('010', '塘沽', '300450', '004');

本Demo存储的是城市信息:
1:tree_id 当前节点城市id
2:tree_name 当前节点城市名称
3:tree_code 当前节点城市邮编
4.tree_parent_id 当前节点城市上级地市 id

*该树形结构表,根据实际业务添加更多字段.

五、搭建SSH框架

1.创建一个Web项目,首先打开Eclipse软件,打开后在工具栏依次点击【File】>【New】>【Dynamic Web Project】,这个就代表新建的项目是WEB项目
在这里插入图片描述
2.如果找不到【Dynamic Web Project】这个选项,说明以前没有建立过WEB项目,所以不在快捷导航里,这时点击【Other】这个选项
在这里插入图片描述
3. 这个界面弹出的是查询窗口,查询的内容是所有我们可以建立的项目类型,比如JAVA项目、WEB项目等,都可以再找个窗口查询得到
在这里插入图片描述
4. 填写项目基本信息, 包括(项目名称, tomcat版本等) *名称自定义
在这里插入图片描述
5.Next到此页面时, 勾选: Generate web.xml deployment descriptor 将自动创建web.xml文件

在这里插入图片描述
6.刚创建好的Web工程目录
在这里插入图片描述
7.修改工作空间字符编码 UTF-8
在这里插入图片描述
8.设置JSP编码格式 UTF-8
在这里插入图片描述
9.修改Java代码提示,在下边红色框内输入:.abcdefghijklmnopqrstuvwxyz
在这里插入图片描述
10.控制台->Servers 空白处右键新建一个 Server
在这里插入图片描述
11.如果控制台没有Servers窗口, 选择 Window->Show View->Servers
在这里插入图片描述
如果还没有,就点击下面的 Other… ,里面搜索添加即可

12.选择对应的tomcat版本, 服务名称随意
在这里插入图片描述
13. 选择刚刚新建的Web工程名称,点击add,添加到右侧
在这里插入图片描述
14. 如图,点击 Finish
在这里插入图片描述
15. 此时,服务已经添加完成. 双击新添加的服务,将显示该服务的详细配置信息. http默认端口为:8080
在这里插入图片描述
在这里插入图片描述
16. 在WebContent目录右键,创建一个JSP页面
在这里插入图片描述
17. 命名为 index.jsp , jsp页面输出一段文字,测试服务是否正常启动
在这里插入图片描述
18.选择刚刚新建的Tomcat服务, 右键选择 Start启动服务
在这里插入图片描述
18. 显示一下信息表示服务启动成功, HTTP端口为:8080
在这里插入图片描述
19. 打开浏览器, 地址栏输入: http://localhost:8080/guanglian/ , 正常则会显示刚刚创建的页
在这里插入图片描述
–以上步骤 Web工程以及Tomcat服务已经成功创建–
–以下步骤是SSH框架搭建以及简单的用户登录功能–
20.添加工程所用的jar包到: WebContent->WEB-INF->lib 目录下
在这里插入图片描述
在这里插入图片描述
21. 配置Web.xml文件
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>guanglian</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 让spring随web启动而创建的监听器 -->
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 配置spring配置文件位置参数 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  <!-- 扩大session作用范围 -->
   <filter>
  	<filter-name>openSessionInView</filter-name>
  	<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
  </filter>
  
  <!-- struts2核心过滤器 -->
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

22.配置applicationContext.xml文件
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://www.springframework.org/schema/beans" 
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
							http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
							http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
							http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
	
	<!-- 读取db.properties文件 -->
	<context:property-placeholder location="classpath:db.properties" />
	
	<!-- 配置c3p0连接池 -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
		<property name="driverClass" value="${jdbc.driverClass}" ></property>
		<property name="user" value="${jdbc.user}" ></property>
		<property name="password" value="${jdbc.password}" ></property>
	</bean>
	
	<!-- 核心事务管理器 -->
	<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" >
		<property name="sessionFactory" ref="sessionFactory" ></property>
	</bean>

	<!-- 开启注解事务 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	<!-- 在spring配置中放置hibernate配置信息 -->
	<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
	
		<!-- 将连接池注入到sessionFactory, hibernate会通过连接池获得连接 -->
		<property name="dataSource" ref="dataSource" ></property>
		
		<!-- 配置hibernate基本信息 -->
		<property name="hibernateProperties">
			<props>
				<!-- 方言 -->
				<prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop>
				
				<!-- 可选配置 -->
				<prop key="hibernate.show_sql" >true</prop>
				<prop key="hibernate.format_sql" >true</prop>
				<prop key="hibernate.hbm2ddl.auto" >update</prop>
			</props>
		</property>
		<!-- 指定domian数据所在的包路径,spring会自动读取包中的所有配置 -->
		<property name="mappingDirectoryLocations" value="classpath:com/demo/domain" ></property>
		
	</bean>
	
</beans>

23.添加 配置文件: db.properties , applicationContext.xml需要引用的数据库连接配置文件
在这里插入图片描述

jdbc.jdbcUrl=jdbc:mysql://IP地址:端口/数据库?autoReconnect=true&amp;autoReconnectForPools=true&amp;useUnicode=true&amp;characterEncoding=UTF-8
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=用户名
jdbc.password=密码

24.配置struts.xml文件
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	
<struts>
	
	<!-- 将action的创建交给spring容器 -->
	<constant name="struts.objectFactory" value="spring"></constant>
	
	<package name="guanglian" namespace="/" extends="struts-default" >
	
		<interceptors>
			<!-- 注册拦截器 -->
			<interceptor name="loginInterceptor" class="com.demo.web.interceptor.loginInterceptor"></interceptor>
			
			<!-- 配置拦截器栈 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="loginInterceptor">
					<!-- 放行的方法 -->
					<param name="excludeMethods">login</param>
				</interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 指定默认拦截器栈 -->
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
		
		<!-- 全局结果集配置 -->
		<global-results>
			<result name="toLogin" type="redirect" >/login.jsp</result>
		</global-results>
	
		<!-- 异常处理的配置 -->
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
	</package>
	
</struts>

25.分层创建包路径,并且创建数据表对应的实体类
在这里插入图片描述

实体类: City.java

package com.demo.domain;

/**
 * @Description 城市信息实体类
 * @author TianHB
 */
public class City {

	private String tree_id; //树形结构_id
    private String tree_name; //树形结构_名称
    private String tree_code; //树形结构_编号
    private String tree_parent_id; //树形结构_父类id
   
	public String getTree_id() {
		return tree_id;
	}
	public void setTree_id(String tree_id) {
		this.tree_id = tree_id;
	}
	public String getTree_name() {
		return tree_name;
	}
	public void setTree_name(String tree_name) {
		this.tree_name = tree_name;
	}
	public String getTree_code() {
		return tree_code;
	}
	public void setTree_code(String tree_code) {
		this.tree_code = tree_code;
	}
	public String getTree_parent_id() {
		return tree_parent_id;
	}
	public void setTree_parent_id(String tree_parent_id) {
		this.tree_parent_id = tree_parent_id;
	}
}

实体类: User.java

package com.demo.domain;

/**
 * @Description 用户信息实体类
 * @author TianHB
 */
public class User {

	private String user_id; //用户id
	private String user_name; //用户名
	private String user_password; //用户登录密码
	private String create_time; //该用户创建时间
	private String update_time; //该用户信息更新时间(例如修改密码)
	
	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public String getUser_password() {
		return user_password;
	}
	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}
	public String getCreate_time() {
		return create_time;
	}
	public void setCreate_time(String create_time) {
		this.create_time = create_time;
	}
	public String getUpdate_time() {
		return update_time;
	}
	public void setUpdate_time(String update_time) {
		this.update_time = update_time;
	}
}

26.创建实体类对应的Hibernate映射文件,在domain包下
在这里插入图片描述
User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.demo.domain" >
	<!-- User 用户实体类对象映射文件 -->
	<class name="User" table="sys_user" >
		<id name="user_id">  
           <column name="user_id"/>  
        </id>  
		<property name="user_name"  ></property>
		<property name="user_password"  ></property>
		<property name="create_time"  ></property>
		<property name="update_time"  ></property>
	
	</class>
</hibernate-mapping>

City.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.demo.domain" >
	<!-- City 城市信息实体类对象映射文件 -->
	<class name="City" table="tree_list" >
		<!-- 主键id -->
		<id name="tree_id">  
           <column name="tree_id"/>  
        </id>  
		<property name="tree_name"  ></property>
		<property name="tree_code"  ></property>
		<property name="tree_parent_id"  ></property>
	</class>
</hibernate-mapping>

27.在WebContent目录下创建一个登陆页面: login.jsp
在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body>
	
	<form action="${pageContext.request.contextPath}/UserAction_login" method="post">
	
		用户名:<input type="text" name="user_name">
		
	 	   密码:<input type="password" name="user_password">
		
			   <input type="submit" value="登录">
			   
			   <!-- 错误提示 -->
			   <font color="red" ><s:property value="exception.message" /> </font>
	</form>
	
	<s:debug></s:debug>
	
</body>
	
</html>

28.创建登录的 UserAction.java , login.jsp登录请求的: UserAction_login 方法
在这里插入图片描述
UserAction.java

package com.demo.web.action;

import com.demo.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * @Description 用户Action
 * @author TianHB
 */
public class UserAction extends ActionSupport implements ModelDriven<User>{
	
	//用户接收前端请求页面传来的参数对象
	private User user = new User();

	private UserService userService;

	//注入UserService对象
	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	/**
	 * @Description 用户登录方法
	 * @return
	 */
	public String login() throws Exception {
		
		//1.调用Service执行查询对象方法
		User u = userService.getUserByNamePassword(user);
		
		//2.将返回的user对象放入session域中
		ActionContext.getContext().getSession().put("user", u);
		
		//3.重定向到首页
		return "toHome";
	}

	@Override
	public User getModel() {
		return user;
	}
	
}

29.创建登录的 UserService.java , 并编写获取用户对象方法
在这里插入图片描述

package com.demo.service;

import com.demo.domain.User;

/**
 * @Description 用户Service
 * @author TianHB
 */
public interface UserService {
	
	/**
	 * @Description 获取用户对象
	 * @return
	 */
	User getUserByNamePassword(User user);
	
}

30.创建UserService.java的实现类: UserServiceImpl.java
在这里插入图片描述

package com.demo.service.impl;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.demo.dao.UserDao;
import com.demo.domain.User;
import com.demo.service.UserService;

/**
 * @Description 用户Service实现类
 * @author TianHB
 */
@Transactional(isolation=Isolation.REPEATABLE_READ, propagation=Propagation.REQUIRED, readOnly=true)
public class UserServiceImpl implements UserService{

	private UserDao userDao;
	
	//注入UserDao
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
	/**
	 * @Description 调用dao层获,获取User对象
	 * @return
	 */
	@Override
	public User getUserByNamePassword(User user) {
		
		System.out.println(userDao);
		
		//调用Dao层获取用户对象
		User u = userDao.getUserByUserName(user.getUser_name());
		
		//判断用户是否存在,不存在抛出异常:提示用户名不存在
		if(u == null) {
			throw new RuntimeException("用户名不存在");
		}
		
		//判断用户输入的密码和数据库中的密码是否一致,如何不一致抛出异常:用户名或密码错误
		if(!u.getUser_password().equals(user.getUser_password())) {
			throw new RuntimeException("用户名或密码错误");
		}
		
		//返回查询到的用户对象
		return u;
	}
}

31.创建用户登录的Dao层, UserDao.java
在这里插入图片描述

package com.demo.dao;

import com.demo.domain.User;

/**
 * @Description 用户Dao接口
 * @author TianHB
 */
public interface UserDao {
	
	/**
	 * @Description 根据用户名查询用户对象信息
	 * @return
	 */
	User getUserByUserName(String userName);
	
}

32.创建UserDao.java的实现类:UserDaoImpl.java
在这里插入图片描述

package com.demo.dao.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.demo.dao.UserDao;
import com.demo.domain.User;

/**
 * @Description 用户Dao实现类
 * @author TianHB
 */
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{

	/**
	 * @Description 根据用户名获取用户对象
	 * @return
	 */
	@Override
	public User getUserByUserName(String userName) {
		
		//创建Criteria查询
		DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
		
		//添加查询条件
		criteria.add(Restrictions.eq("user_name", userName));
		
		//查询返回的对象集合
		List<User> userList = (List<User>) getHibernateTemplate().findByCriteria(criteria);
		
		//如果集合不为null,并且长度大于一说明查询到了用户对象,获取第一个并返回
		if(userList != null && userList.size() > 0) {
			return userList.get(0);
		}else {
			return null;
		}
		
	}

}

33.将用户登录的三层: Action,Service,Dao添加到Spring容器中
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://www.springframework.org/schema/beans" 
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
							http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
							http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
							http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
	
	<!-- 读取db.properties文件 -->
	<context:property-placeholder location="classpath:db.properties" />
	
	<!-- 配置c3p0连接池 -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
		<property name="driverClass" value="${jdbc.driverClass}" ></property>
		<property name="user" value="${jdbc.user}" ></property>
		<property name="password" value="${jdbc.password}" ></property>
	</bean>
	
	<!-- 核心事务管理器 -->
	<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" >
		<property name="sessionFactory" ref="sessionFactory" ></property>
	</bean>

	<!-- 开启注解事务 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	<!-- 在spring配置中放置hibernate配置信息 -->
	<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
	
		<!-- 将连接池注入到sessionFactory, hibernate会通过连接池获得连接 -->
		<property name="dataSource" ref="dataSource" ></property>
		
		<!-- 配置hibernate基本信息 -->
		<property name="hibernateProperties">
			<props>
				<!-- 方言 -->
				<prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop>
				
				<!-- 可选配置 -->
				<prop key="hibernate.show_sql" >true</prop>
				<prop key="hibernate.format_sql" >true</prop>
				<prop key="hibernate.hbm2ddl.auto" >update</prop>
			</props>
		</property>
		<!-- 指定domian数据所在的包路径,spring会自动读取包中的所有配置 -->
		<property name="mappingDirectoryLocations" value="classpath:com/demo/domain" ></property>
		
	</bean>

	<!-- UserAction -->
	<bean name="userAction" class="com.demo.web.action.UserAction" scope="prototype">
		<property name="userService" ref="userService"></property>
	</bean>

	<!-- UserService -->
	<bean name="userService" class="com.demo.service.impl.UserServiceImpl">
		<property name="userDao" ref="userDao"></property>
	</bean>
	
	<!-- UserDao -->
	<bean name="userDao" class="com.demo.dao.impl.UserDaoImpl">
		<!-- 注入sessionFactory -->
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
</beans>

34.在struts.xml文件中配置login请求转发的jsp
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	
<struts>
	
	<!-- 将action的创建交给spring容器 -->
	<constant name="struts.objectFactory" value="spring"></constant>
	
	<package name="guanglian" namespace="/" extends="struts-default" >
	
		<interceptors>
			<!-- 注册拦截器 -->
			<interceptor name="loginInterceptor" class="com.demo.web.interceptor.loginInterceptor"></interceptor>
			
			<!-- 配置拦截器栈 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="loginInterceptor">
					<!-- 放行的方法 -->
					<param name="excludeMethods">login</param>
				</interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 指定默认拦截器栈 -->
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
		
		<!-- 全局结果集配置 -->
		<global-results>
			<result name="toLogin" type="redirect" >/login.jsp</result>
		</global-results>
	
		<!-- 异常处理的配置 -->
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
	
			
		<action name="UserAction_*" class="userAction" method="{1}" >
			<result name="toHome">/index.jsp</result>
			<result name="error" >/login.jsp</result>
		</action>
		
	</package>
	
</struts>

登录成功之后将跳转到index.jsp中,如果登录失败将跳转到本页面

35.浏览器地址栏输入: http://localhost:8080/guanglian/login.jsp ,测试功能效果
在这里插入图片描述
36.输入数据库中存储的用户名密码, 账号: admin 密码: 123 , 登录测试
登录成功跳转页面: 跳转到 index.jsp
在这里插入图片描述
密码错误,登录失败还是本页,并提示: 用户名或密码错误
在这里插入图片描述
用户错误,登录失败还是本页,并提示: 用户名不存在
在这里插入图片描述
37.创建拦截器对象,除了login请求不拦截,其余请求全拦截(如果有注册功能,注册请求需放行)
在这里插入图片描述

package com.demo.web.interceptor;

import java.util.Map;

import com.demo.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
 * @Description 配置拦截器对象
 * @author TianHB
 *
 */
public class loginInterceptor  extends MethodFilterInterceptor{

	/**
	 * @Description 不拦截登录Action,其他请求Action都拦截
	 * @return
	 */
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		
		//1 获得Session
		Map<String, Object> session = ActionContext.getContext().getSession();
		
		//2 获得登陆标识
		User user = (User) session.get("user");
		
		//3 判断标识是否存在
		if(user != null){
			//存在->放行
			return invocation.invoke();
		}else{
			//不存在-> 重定向到登陆页面
			return "toLogin";
		}
	}

}

38.struts.xml中配置该拦截器对象的拦截规则
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	
<struts>
	
	<!-- 将action的创建交给spring容器 -->
	<constant name="struts.objectFactory" value="spring"></constant>
	
	<package name="guanglian" namespace="/" extends="struts-default" >
	
		<interceptors>
			<!-- 注册拦截器 -->
			<interceptor name="loginInterceptor" class="com.demo.web.interceptor.loginInterceptor"></interceptor>
			
			<!-- 配置拦截器栈 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="loginInterceptor">
					<!-- 放行的方法 -->
					<param name="excludeMethods">login</param>
				</interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 指定默认拦截器栈 -->
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
		
		<!-- 全局结果集配置 -->
		<global-results>
			<result name="toLogin" type="redirect" >/login.jsp</result>
		</global-results>
	
		<!-- 异常处理的配置 -->
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
	
			
		<action name="UserAction_*" class="userAction" method="{1}" >
			<result name="toHome">/index.jsp</result>
			<result name="error" >/login.jsp</result>
		</action>
		
	</package>
	
</struts>

39.测试拦截器是否好用, 在UserAction.java中创建一个 test方法,进行访问测试
在这里插入图片描述
40.访问 http://localhost:8080/guanglian/UserAction_test 测试拦截器
当前用户为未登录状态:
在这里插入图片描述
测试拦截器成功跳转到: http://localhost:8080/guanglian/login.jsp 登录页面
在这里插入图片描述
现在进行登录:
在这里插入图片描述
再次测试访问: http://localhost:8080/guanglian/UserAction_test
查看后台输出语句:
在这里插入图片描述
拦截器测试通过.
–以上步骤是SSH框架搭建以及简单的用户登录功能–
–以下步骤是树形结构的后台代码以及前台页面功能–

树形结构还原功能预览:
在这里插入图片描述
*因时间原因,后续完善树形结构的后台代码以及前台页面功能,抱歉…
*多有不足,有问题的地方还请多多指教,谢谢…

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页