首页 > 代码库 > 使用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 的配置:

  1. 添加struts2 依赖

<!-- struts2 依赖 -->

<dependency>

<groupId>org.apache.struts</groupId>

<artifactId>struts2-core</artifactId>

<version>2.2.1</version>

</dependency>

是的。你没有看错。这里只用写一个对于struts2-core的依赖说明即可(这里我们只使用struts2 最简单的功能,如果要使用较为复杂的功能。你就要添加其他的依赖声明。这里我们的功能没那么复杂,很简单。) ,maven会自动下载与之有关的依赖包。

  1. 编写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;

}

 

 

}

 

  1. 编写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>

 

  1. 编写登陆页面:

<%@ 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 的整合