新手入门,记录下在使用Struts时遇到的问题,以防忘记。以下内容以登录功能为例。
代码内容为转载,文章内容主要是为记录本人遇到的问题。
1、建立Struts工程
1.首先要下载Struts2.5.13需要用的包,网上许多地方可以下载,就不赘言。下载完后,将其中的如下所示的包直接复制到自己的工程中的WEB-INF/lib中
2.在src新建RegisterAction类,内容如下
package com.ssh.action;
import com.opensymphony.xwork2.ActionSupport;
import com.ssh.beans.UserForm;
import com.ssh.service.UserManager;
import com.ssh.serviceImpl.UserManagerImpl;
public class RegisterAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private UserForm user;
private UserManager userManager;
public UserForm getUser() {
return user;
}
public void setUser(UserForm user) {
this.user = user;
}
public UserManager getUserManager() {
return userManager;
}
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
public String execute() {
try {
this.setUserManager(new UserManagerImpl());
userManager.regUser(user);
System.out.println("success");
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
}
此处要注意自己将该类放置的包路径,因为接下来的struts.xml配置文件中需要用到,如果错了,会出现如
Unable to load configuration
这样的错误,本人在此处纠结了很久
3.在src目录下创建struts.xml文件,文件内容如下
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
/Register.jsp
/Success.jsp
/Fail.jsp
4.用户表单类UserForm.java的内容
package com.ssh.beans;
public class UserForm {
private String username;
private String password;
private int gender;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
5.业务逻辑接口UserManager.java的内容
package com.ssh.service;
import com.ssh.beans.UserForm;
public interface UserManager {
public void regUser(UserForm user);
}
6.业务逻辑实现类UserManagerImpl.java的内容
package com.ssh.serviceImpl;
import com.ssh.beans.UserForm;
import com.ssh.service.UserManager;
public class UserManagerImpl implements UserManager {
@Override
public void regUser(UserForm user) {
}
}
7.接着定义web.xml文件,配置过滤器
SSHTest
struts-prepare
org.apache.struts2.dispatcher.filter.StrutsPrepareFilter
struts-execute
org.apache.struts2.dispatcher.filter.StrutsExecuteFilter
struts-prepare
/*
struts-execute
/*
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
8.最后是三个jsp页面文件
Register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
User Register Page
name="user.gender" label="性别" value="1">
Fail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
failure!
Success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
success!
附完成以上操作后的程序目录图如下
注意细节,按照上述流程将工程内容配置好,Struts框架就可以跑起来。
2、在Struts基础上整合Hibernate
1.操作步骤:
1.整合hibernate,我使用的是hibernate5.2.5,此处要注意版本问题,和文章不同版本的hibernate可能会出现运行错误。hibernate的jar包如下:
2.接着在上面项目的基础上添加com.ssh.dao和com.ssh.daoImpl包。分别建立BaseDao接口和UserDao类
3.在数据库中创建对应的表user来写入要注册的用户。创建表的sql脚本如下:
create table user(
userId int auto_increment,
userName varchar(16) not null,
password varchar(16) not null,
gender int not null,
primary key(userId)
);
- 创建user表的
Hibernate
映射文件。因为这里要创建user表
对应的POJO类
,所以我这里把之前com.ssh.beans
包改成com.ssh.forms
包,用来存放页面传过来的表单数据,新创建com.ssh.beans
包,用来创建POJO对象
来对应数据库中的表。路径:POJO类同目录
。
- 建立Hibernate配置文件。路径:
src目录下
。
- 编写
Session工厂类
。整合Spring
后,数据源的创建和SessionFactory
的创建都交给Spring
去管理,就无需这个工厂类了,临时创建在daoImpl
包里面。
- 修改业务逻辑实现类。
2.修改后项目视图:
3.编写代码
3.1BaseDao.java的内容如下:
package com.ssh.dao;
import org.hibernate.HibernateException;
import org.hibernate.Session;
public interface BaseDao {
public Session getSession();
public void setSession(Session session);
public void saveObject(Object obj)throws HibernateException;
}
3.2实体类User.java的内容
package com.ssh.beans;
public class User {
private String username;
private String password;
private int gender;
private int userId;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
3.3POJO类UserDao.java的内容
package com.ssh.daoimpl;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import com.ssh.dao.BaseDao;
public class UserDao implements BaseDao {
private Session session;
@Override
public Session getSession() {
return session;
}
@Override
public void setSession(Session session) {
this.session = session;
}
@Override
public void saveObject(Object obj) throws HibernateException {
session.save(obj);
}
}
3.4POJO类User.java的Hibernate映射文件User.hbm.xml的内容
代码
说明将根据本地数据库的设置来创建userId
,如MySQL中将表user
的userId
设置为自动增长,则在保存记录是,userId
将自动增长。对于需要在程序中指定主键的值,则将generator
的class属性设置为assigned
。
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
not-null="true" length="16">
not-null="true" length="16" />
3.5Hibernate
的配置文件hibernate.cfg.xml
的内容,放在src目录下
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
root
密码?
org.hibernate.dialect.MySQLDialect
true
3.6工厂类SessionFactory
的内容。
不同的hibernate版本编写有些不同,这里我用hibernate5.2.5配置的时候按照hibernate配置的出了经典的问题 unknown entity 请看这篇文章-传送门,下面附上正确的代码
package com.ssh.daoimpl;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateSessionFactory {
private static final ThreadLocal threadLocal = new ThreadLocal<>();
//加载默认的src下的hibernate.cfg.xml
private static final Configuration cfg = new Configuration().configure();
private static SessionFactory sessionFaction;
public static Session currentSession()throws HibernateException{
// 创建Session
Session session = threadLocal.get();
if (session == null||session.isOpen()==false) {
if (sessionFaction==null) {
try {
sessionFaction = cfg.buildSessionFactory();
//System.out.println("HibernateSessionFactory---sessionfactory:"+sessionFaction);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
session=sessionFaction.openSession();
//System.out.println("HibernateSessionFactory--session:"+session);
threadLocal.set(session);
}
return session;
}
public static void closeSession()throws HibernateException{
Session session= threadLocal.get();
threadLocal.set(null);
if (session!=null) {
session.close();
}
}
//public static void main(String []args){
// Session session = currentSession();
// System.out.println("session:"+session);
//}
}
3.7修改后的业务逻辑实现类UserManagerImpl
的内容。
package com.ssh.serviceImpl;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ssh.beans.User;
import com.ssh.dao.BaseDao;
import com.ssh.daoimpl.HibernateSessionFactory;
import com.ssh.daoimpl.UserDao;
import com.ssh.forms.UserForm;
import com.ssh.service.UserManager;
public class UserManagerImpl implements UserManager {
private UserDao dao;
private Session session;
public UserManagerImpl() {
// TODO Auto-generated constructor stub
dao=new UserDao();
}
@Override
public void regUser(UserForm userForm) {
session = HibernateSessionFactory.currentSession();
System.out.println("UserManegerImpl---session:" + session);
dao.setSession(session);
// 获取事务
Transaction transaction = session.beginTransaction();
// 构造uer对象
User user = new User();
user.setUsername(userForm.getUsername());
user.setPassword(userForm.getPassword());
user.setGender(userForm.getGender());
// 保存对象
dao.saveObject(user);
// 提交事务
transaction.commit();
HibernateSessionFactory.closeSession();
}
public static void main(String[] args) {
User userForm = new User();
userForm.setGender(1);
userForm.setPassword("12121212");
userForm.setUsername("zjz");
HibernateSessionFactory.currentSession().save(userForm);
// new UserManagerImpl().regUser(userForm);
}
}
按上述流程走完,运行Register.jsp页面进行注册,跳转到成功页面,查看数据库中数据,数据增加了。此外我不小心把其中一个包daoimpl命名城小写了,大家最好改成大写daoImpl,还有有一些代码好像又是daoImpl,代码不一致导致的错误大家就看着修改了。
还有一个问题,在按上述流程走完,且代码没有提示错误,运行时会出错,具体错忘了是什么,是关于UserDao的,即你的代码UserDao改完了,可是运行时UserDao却是没修改前的,那是因为你的JVM里运行的UserDao没改变。运行代码时记得按project的clean一下,清除一下JVM即可。
3.在Struts + Hibernate项目中整合Spring整合Spring
本人觉得在这里最主要的是jar包问题,导入正确的包才能使程序正确运行,本人大多数遇到的问题其实都是jar包没导入的问题,在反复测试后,得出需要导入的jar包。除spring目录下的jar包外,还需增加Struts的struts2-spring-plugin-2.5.13.jar和hibernate的c3p0-0.9.2.1.jar加mchange-commons-java-0.2.3.4.jar
总的jar包如下:
- applicationContext.xml
-
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
destroy-method="close">
com.mysql.jdbc.Driver
jdbc:mysql://localhost/test
root
密码?
80
1
1
20
com/ssh/beans/User.hbm.xml
org.hibernate.dialect.MySQLDialect
true
false
update
- 修改后的接口类Dao和实现类UserDao的内容。
BaseDao.java
package com.ssh.dao;
import org.hibernate.HibernateException;
public interface BaseDao {
public void saveObject(Object obj) throws HibernateException;
}
- UserDao.java
package com.ssh.daoImpl;
import org.hibernate.HibernateException;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import com.ssh.dao.BaseDao;
public class UserDao extends HibernateDaoSupport implements BaseDao {
@Override
public void saveObject(Object obj) throws HibernateException {
getSessionFactory().openSession().save(obj);
}
}
4.修改后的业务逻辑实现类UserManagerImpl的内容。
package com.ssh.serviceImpl;
import org.hibernate.HibernateException;
import org.springframework.beans.BeanUtils;
import com.ssh.beans.User;
import com.ssh.dao.BaseDao;
import com.ssh.forms.UserForm;
import com.ssh.service.UserManager;
public class UserManagerImpl implements UserManager {
private BaseDao dao;
public void setDao(BaseDao dao) {
this.dao = dao;
}
@Override
public void regUser(UserForm userForm) throws HibernateException {
User user = new User();
BeanUtils.copyProperties(userForm, user);
dao.saveObject(user);
}
}
5.修改后的用户注册Action类RegisterAction的内容。
package com.ssh.action;
import com.opensymphony.xwork2.ActionSupport;
import com.ssh.forms.UserForm;
import com.ssh.service.UserManager;
public class RegisterAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private UserForm user;
private UserManager userManager;
public UserForm getUser() {
return user;
}
public void setUser(UserForm user) {
this.user = user;
}
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
public String execute() {
try {
userManager.regUser(user);
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
}
SSH
struts-prepare
org.apache.struts2.dispatcher.filter.StrutsPrepareFilter
struts-execute
org.apache.struts2.dispatcher.filter.StrutsExecuteFilter
struts-prepare
/*
struts-execute
/*
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
index.jsp
- 修改后的Struts配置文件struts.xml的内容
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
/Register.jsp
/Success.jsp
/Fail.jsp
总结
最后:
框架玩的就是Jar包、配置,对初学者可能会有挑战性。希望本人的项目SSHShop对有需要的人有所帮助。
附整个项目目录结构图如下:
此外声明,本文章内容为在转载基础上进行的修改。