struts和hibernate简单整合

最近自己研究了下ssh框架,目前练习了struts+hibernate,特来记录下。

 首先去官网下载最新的包,我的都是最新的,当然最新的也有最新的坑.....

首先创建文件总目录

先配置必须的xml文件

1.hibernate.fig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
	
		<!-- 
		#hibernate.dialect org.hibernate.dialect.MySQLDialect
		#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
		#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
		#hibernate.connection.driver_class com.mysql.jdbc.Driver
		#hibernate.connection.url jdbc:mysql:///test
		#hibernate.connection.username gavin
		#hibernate.connection.password
		 -->
		 <!-- 数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		 <!-- 数据库url -->
	    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/shop</property>
		 <!-- 数据库连接用户名 -->
		<property name="hibernate.connection.username">root</property>
		 <!-- 数据库连接密码 -->
		<property name="hibernate.connection.password">123456</property>
		<!-- 数据库方言
			不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
			sql99标准: DDL 定义语言  库表的增删改查
					  DCL 控制语言  事务 权限
					  DML 操纵语言  增删改查
			注意: MYSQL在选择方言时,请选择最短的方言.
		 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		
		<!-- #hibernate.show_sql true 
			 #hibernate.format_sql true
		-->
		<!-- 将hibernate生成的sql语句打印到控制台 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
		<property name="hibernate.format_sql">true</property>
		<!-- 
		## auto schema export  自动导出表结构. 自动建表
		#hibernate.hbm2ddl.auto create		自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
		#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
		#hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
		#hibernate.hbm2ddl.auto validate	校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
		 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 引入orm元数据
			路径书写: 填写src下的路径
		 -->
		<mapping resource="entity/User.hbm.xml" />
		
	</session-factory>
</hibernate-configuration>

这是主配置文件,里面包括了数据库中的实体映射表

要 放在这里面,比较清楚

<?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">
   <!-- 配置表与实体对象的关系 -->
   <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. -->
<hibernate-mapping package="entity" >
	<!-- 
		class元素: 配置实体与表的对应关系的
			name: 完整类名
			table:数据库表名
	 -->
	<class name="User" table="UserExe" >
		<!-- id元素:配置主键映射的属性
				name: 填写主键对应属性名
				column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
				type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
						每个类型有三种填法: java类型|hibernate类型|数据库类型
				not-null(可选):配置该属性(列)是否不能为空. 默认值:false
				length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
		 -->
		<id name="userId"  >
			<!-- generator:主键生成策略(明天讲) -->
			<generator class="native"></generator>
		</id>
		<!-- property元素:除id之外的普通属性映射
				name: 填写属性名
				column(可选): 填写列名
				type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
						每个类型有三种填法: java类型|hibernate类型|数据库类型
				not-null(可选):配置该属性(列)是否不能为空. 默认值:false
				length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
		 -->
		<property name="userName" column="userName" >
		
		</property>
		<property name="userAge" column="userAge" ></property>
		
	</class>
</hibernate-mapping>

hibernate的一大好处就是自己 根本就不需要建表,写sql语句,他已经封装好了,配置文件配置好后直接调用就好

2.struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">


<struts>
   <constant name="struts.convention.action.suffix" value="Controller" />
   
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	
	<constant name="struts.convention.action.mapAllMatches" value="true" />
	<constant name="struts.action.extension" value="action,," />
	<constant name="struts.convention.package.locators" value="example" />
	
    <package name="strutsTest" namespace="/asd" extends="struts-default">
		<action name="test" class="com.test.ActionForTest" method="test">
		   <result name="success">/show.jsp</result> 
		</action>
	</package>
	
	
	
    <package name="userAction" namespace="/userAction" extends="struts-default">
		<action name="userActionImpl_*" class="userAction.userActionImpl" method="{1}">
		   <result name="tofindAllUser">/findAllUser.jsp</result> 
	
		   <result name="tofindUser">/show.jsp</result> 
		    <allowed-methods>check,index,findAllUser,saveUser,deleteUser,updateUser,findUser,getModel,findByIdUser</allowed-methods>
		    <!--2.5的新特性,增加方法白名单-->
		</action>
	</package>
	
</struts>

最后那里,struts2.5的 新特性需要注意一下,里面要是没有写方法,则访问不到这个方法,在以前的版本是没有这个的,增加在这个提高了struts2.5的安全性,我也用到了通配符,*是什么,则method就调用什么方法

3.个人认为hibernate的一些必要的步骤需要记下来并且熟练掌握,并且 封装成工具类就更好了

package utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;



public class HibernateUtils {
  
	private static SessionFactory buildSessionFactory = null;
			
	static {   //一个web项目只能有一个SessionFactory,类加载器时执行,读取到的类放在类的缓存区里
		//1.读取配置文件
		Configuration configure = new Configuration().configure();
		//2.创建SessionFactory
         buildSessionFactory = configure.buildSessionFactory();
	}
  
	public static   Session openSession() {   //开启一个session
		 
        //3.创建session
		Session session = buildSessionFactory.openSession(); 		
	    return  session;
	
	}
	
	public static   Session getCurrentSession() {   //获得与当前线程绑定的session
		 
        //3.创建session
		Session session = buildSessionFactory.getCurrentSession(); 		
	    return  session;
	
	}
	
	
	public static   void Transaction(Session session) {
	 //5.开启事务
    Transaction beginTransaction = session.beginTransaction();
     //6.提交事务
    beginTransaction.commit();
    //7.关闭session,释放资源
    session.close();
	}
	
}

4.

package userdao;

import java.util.List;
import java.util.Scanner;

import org.hibernate.Session;
import org.hibernate.query.Query;

import entity.User;
import utils.HibernateUtils;

public class userDaoImpl implements userDao {
  
	
	//Session openSession = HibernateUtils.openSession();
	
	public void saveUser(User user) {
		// TODO Auto-generated method stub
		Session openSession = HibernateUtils.openSession();
		openSession.save(user);
		HibernateUtils.Transaction(openSession);
		
	}

	public void deleteUser(int userId) {
		// TODO Auto-generated method stub
		Session openSession = HibernateUtils.openSession();
		User user = openSession.get(User.class, userId);
		openSession.delete(user);
		HibernateUtils.Transaction(openSession);
	}

	public void updateUser(User user) {
		// TODO Auto-generated method stub
		Session openSession = HibernateUtils.openSession();
		openSession.update(user);
		HibernateUtils.Transaction(openSession);
	}

	public User findUser(int userId) {
		// TODO Auto-generated method stub
		Session openSession = HibernateUtils.openSession();
		User user = openSession.get(User.class, userId);
		HibernateUtils.Transaction(openSession);
		return user;
	}

	public List<User> findAllUser() {
		// TODO Auto-generated method stub
		Session openSession = HibernateUtils.openSession();
		 List<User> list = openSession.createQuery("from User").list();  //from  实体类表名
		 System.out.println("运行了");		 
		HibernateUtils.Transaction(openSession);
		return list;
	}
}

这是dao层代码,每个方法都要创建session和关闭 session如果只开启一次但是在 每个方法都关闭的话,那么你调用这个方法的时候系统会显示已关闭(由于上一个方法已经关闭session)

5.下面这个是action里面的代码。我用了模型驱动方式ModelDriven<T>,这样的话,jsp 页面里的属性的name只要和T 

里面的属性 对应上即可,不必要user.name 这样

package userAction;

import java.util.List;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import entity.User;
import userService.userService;
import userService.userServiceImpl;

public class userActionImpl  extends  ActionSupport   implements  ModelDriven<User>,  userAction  {

	//从jsp接受过来更改的对象或者其他数据   implements userAction    implements ModelDriven<User>
	private userService us = new userServiceImpl();
	//准备个user对象
	private User user = new User();


	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("execute保存的user是"+user);
		return super.execute();
	}


	public String saveUser() {
		// TODO Auto-generated method stub
		System.out.println("保存的user是"+user);
		us.saveUser(user);
		return findAllUser();
		
	//	return  findAllUser(); //重定向到action
	}

	public String deleteUser() {
		// TODO Auto-generated method stub
		us.deleteUser(user.getUserId());
		return findAllUser();
	}

	public String updateUser() {
		// TODO Auto-generated method stub
		us.updateUser(user);
		return findAllUser();
	}

	public String findUser() {
		// TODO Auto-generated method stub
		User findUser = us.findUser(user.getUserId());
		System.out.println("findUser是"+findUser);
		ActionContext.getContext().put("findUser", findUser);
		return "tofindUser";
	}

	public String findAllUser() {
		// TODO Auto-generated method stub
		List<User> findAllUser = us.findAllUser();
		ActionContext.getContext().put("findAllUser", findAllUser);
		System.out.println("findAllUser是"+findAllUser);
		return 	 "tofindAllUser";
	}

	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}


}

6.然后就是struts 前后交互jsp界面  注意到我用到了struts标签,与from标签不同的是他提交的时候可以指定要调用action中的哪一个方法,一个表单对应一个action,不同的按钮对应 action中的不同的 方法,如果用了模型驱动方式,则user里的属性与表单中的name对应的属性一样。就可以直接传进去

<body>
	<s:form action="userActionImpl?" method="post" namespace="/userAction" >
	
  <div class="form-group">
    <label for="userName">输入您的名字</label>
    <input type="userName" class="form-control" id="userName" name="userName" placeholder="输入您的名字">
  </div>
  <div class="form-group">
    <label for="userAge">输入您的年龄</label>
    <input type="userAge" class="form-control" id="userAge"  name="userAge"  placeholder="输入您的年龄">
  </div>

<s:submit class="btn btn-default" method ="saveUser" value="确认保存2"></s:submit>
 
</s:form>

	</body>

7.然后在前端在 显示出来    这是查找所有的jsp

<s:iterator value="#findAllUser" var="o">
        ${o}<br/>
   
    </s:iterator>
   

这里面对应action里面的操作,action从jsp中获取到值之后,存进findAllUser中,然后通过struts标签取出来

要用到struts标签的的话需要加

    <%@ taglib prefix="s" uri="/struts-tags"%> 

这句话

   <s:iterator value="#findUser" var="o">
        Id:${o.userId}<br/>
          姓名:  ${o.userName}<br/>
     年龄:     ${o.userAge}<br/>
    </s:iterator>

这是查找 单个的jsp界面,其实都是用遍历集合的方法,应该还有更好的方法

8.然后是运行截图

 

9.前端用到了 bootstrap的一些框架

 在这简单的小例子中,我遇到了很多的问题,比如说当hibernate和struts的jar包 整合的时候,会有包冲突

还有如果报错index()什么没有定义啊之类的错误    

最后还要在struts.xml配置中写这么一句话

 <global-allowed-methods>regex:.*</global-allowed-methods>

还有方法白名单,前文中提到过,为了增加安全性

10.struts的拦截器配置在web.xml中,没有这个,一切白费,拦截器在action附近执行(过滤器的范围比拦截器广)

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="starter" version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>Struts 2 Rest Example</display-name>


    <filter>
        <filter-name>action2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>


    <filter-mapping>
        <filter-name>action2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

  

</web-app>

还有一个修改struts常量配置,一共有三个方法,重点掌握第二个方法,在struts.xml中修改

修改常量配置

 

 

修改方式1

 

修改方式2在struts.xml文件里改

 

 

方式三在web.xml修改

 

 但是还有很多遗憾,比如说我的软件导入约束就是不行,xml配置文件里没有提示很伤,以及还有很多没有深挖的知识点

不过了解了这么多也是很开心,互相努力。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值