首页 > 代码库 > 使用maven实现struts2 spring hibernate 的整合
使用maven实现struts2 spring hibernate 的整合
今天用maven实现了struts2 , spring, hibernate 的整合。
这中间出现了不少的错误。大都是因为配置文件出错引起的。在这里整合一下:
注:这里我们实现一个登陆功能。用户从jsp页面输入用户名和密码,服务器校验其正确性后,根据正确与否跳转到不同的页面。
一,整合之后的项目结构:
可以看到,与以前的“动态网站”项目的结构不同。Maven项目中所有的框架配置文件都放在了“resources”目录下面。在“resources”中的文件最终会被copy到项目的 WEB-INF/classes目录下面。
另外,在项目结构图中还可以看到项目有一个错误。看上去他是在Java resources目录上。但是你也可以看到他的子目录中是没有错误的。其实错误如下:
如果你没看见Problems这一个窗口,可以选择:window --> show view-->other.. --> general -->Problems
而且这个问题不影响编译和打包。就像不存在一样。暂时不知道如何修复(quick fix 无效)。
好了。项目结构就是这样。下面开始时S2SH的配置。
先看一下代码的结构:
二. Struts2 的配置:
- 添加struts2 依赖
<!-- struts2 依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.2.1</version>
</dependency>
是的。你没有看错。这里只用写一个对于struts2-core的依赖说明即可(这里我们只使用struts2 最简单的功能,如果要使用较为复杂的功能。你就要添加其他的依赖声明。这里我们的功能没那么复杂,很简单。) ,maven会自动下载与之有关的依赖包。
- 编写Actoin事务类
package org.feiruan.bookstore.struts;
import org.feiruan.bookstore.tool.HibernateTool;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
private String userName;
private String passw;
@Override
public String execute() throws Exception {
//等配置完spring之后再写
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassw() {
return passw;
}
public void setPassw(String passw) {
this.passw = passw;
}
}
- 编写struts.xml文件,此文件在maven项目中应该放在resources目录下面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="login" namespace="/login" extends="struts-default">
<action name="login" class="org.feiruan.bookstore.struts.LoginAction">
<result name="success">/success.jsp</result>
<result name="error">/fail.jsp</result>
</action>
</package>
</struts>
- 编写登陆页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h2>Please Login !</h2>
<form name="loginFrom" action="<%=request.getContextPath() %>/login/login" method="post">
账号:<input type="text" name="userName"/>
密码:<input type="password" name="passw"/>
<input type="submit" value="http://www.mamicode.com/提交"/>
</form>
</body>
</html>
之所以把页面放在最后写,是因为在编写页面时一定要注意form标签的action属性值的写法。(如上:)
action="<%=request.getContextPath() %>/login/login"
或者:action="login/login"
不过为了保险起见。建议使用第一种写法,把项目路径(request.getContextPath())也添加到路径里。要是使用第二种写法的话。千万不要写成这样:action="/login/login" 路径字符串的前面不要加“/”,回报404错误的。你如果加了“/”表示的就是从Tomcat的webapps目录下面查找“login/login”。不加”/”表示的是从当前的项目根目录开始查找“login/login”。所以为了不引起这种错误,建议还是把request.getContextPath()也一起写上吧。但如果你的登陆页面是HTML页面。那你就只好使用第二种写法了,这时候就请多多注意一下吧。
还用要注意的就是要提交的数据的name。
账号:<input type="text" name="userName"/>
密码:<input type="password" name="passw"/>
要和你写的action类中的 值域
private String userName;
private String passw;
名称完全一致(包括大小写,所以使用驼峰命名法),并为这些值域提供setter和getter方法。以及给该类一个无参的构造函数。
三.Hibernate的配置:
1.添加Hibernate的依赖:
<!-- hibernate 依赖 :hibernate-core , slf4j , javassist -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.15.0-GA</version>
</dependency>
HIbernate的依赖也不多,就三个(Hibernate的官网教程上就用了三个依赖,咱们就按他的来。这里也是只使用Hibernate的基本ORM功能)。
2.编写Hibernate.cfg.xml文件。设置Hibernate:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/bookstoreDB</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="current_session_context_class">thread</property>
<mapping resource="UserInfoBase.hbm.xml"/>
</session-factory>
</hibernate-configuration>
每一条标签是干啥用的就不要问我了,基本上看名字也差不多猜出来了吧。猜不出来的话百度一下吧。
另外,在咱们的例子里。数据库使用的是MySQL。所以我们也要把MySQL数据库的链接依赖库也在pom.xml里面声明一下。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
3.编写实体类(UserInfoBase.java),代表数据库里面的一条数据:
package org.feiruan.bookstore.util;
public class UserInfoBase {
private int id;
private String name;
private String passw;
public UserInfoBase() {
super();
}
public UserInfoBase(int id, String name, String passw) {
super();
this.id = id;
this.name = name;
this.passw = passw;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassw() {
return passw;
}
public void setPassw(String passw) {
this.passw = passw;
}
}
4.编写UserInfoBase.hbm.xml,声明实体类与数据表的映射关系。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.feiruan.bookstore.util">
<class name="UserInfoBase" table="user_info_base">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="passw" column="passw"/>
</class>
</hibernate-mapping>
到这里。Hibernate的配置实际上已经完成了。下面我们来写一个Hibernate的工具类,来从数据库里面根据用户名查找他的密码:
package org.feiruan.bookstore.tool;
import java.util.List;
import org.feiruan.bookstore.util.UserInfoBase;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateTool {
public String getPasswordByName( String name ){
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("from UserInfoBase where name=‘"+name+"‘");
List list = query.list();
if(list!=null&&list.size()!=0){
UserInfoBase info = (UserInfoBase)list.get(0);
return info.getPassw();
}
return null;
}
}
Ok,最后。我们来配置spring。
四.Spring的配置:
1.添加spring依赖:
<!-- spring 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
2.编写spring配置文件(beans.xml),这个配置最简单,都是没有的DTD。真正有用的就一行:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<bean id="hibernateTool" class="org.feiruan.bookstore.tool.HibernateTool"/>
</beans>
在这里我们配置了一个bean,对应的类就是我们写的Hibernate工具类。
3.完成前面未完成的struts2 Action类:
@Override
public String execute() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
HibernateTool tool = (HibernateTool) context.getBean("hibernateTool");
if(passw.equals(tool.getPasswordByName(userName))){
return SUCCESS;
}else{
return ERROR;
}
}
到此为止。Struts2+spring+Hibernate的配置就都完成了。
接下来就可以利用maven将其打包,发布吧。
使用maven实现struts2 spring hibernate 的整合