SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password.
SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html
一、Hibernate(数据层)的搭建:
实现流程
二、Spring(注入实例)的使用:
实现流程
三、Struts2(MVC)的搭建:
实现流程
这里注意一点问题:
Struts2与Hibernate在一起搭建,antlr包,有冲突。MyEclipse9中有这样问题。朋友的MyEclipse10中没有这个问题。
我选择把Struts中antlr包去掉。
DB Browser中反转实体类:
sequence自动增长ID实体类中配置连接:http://www.cnblogs.com/wkrbky/p/5917985.html
编辑web.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <!-- 这是一只拦路虎 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 读取applicationContext.xml文件 不写默认Spring需要读取 WebContent\WEB-INF\applicationContext.xml --> <context-param> <param-name>contextConfigLocation</param-name> <!-- 改变默认读取路径为src目录下的 applicationContext.xml 在改变的路径下还是没找到,便自动到默认路径查找 --> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 定义Spring监听器 class: spring 3.0 Web Libraries 下可以找到。 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 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>
配置applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <!-- 1.:需要导入的命名空间 命名规范: xsi:架构实例 beans:根节点 aop:事务 context:注解 tx:事务管理 xsi:schemaLocation 协议(一个命名规范对应一个协议) 注:若不知道自己使用的框架版本,可以把协议后的版本号去掉,此处已经去掉。 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 注解方式创建Bean <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> --> <!-- 数据源连接池的写法 注意:使用GUI创建的数据源,本地会话工厂改为注解会话工厂 hibernate.dialect:方言改10g,默认9 packagesToScan:注意一下,这里是导入实体类的映射信息。导入实体类的包。 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"> </property> <property name="username" value="root"></property> <property name="password" value="admin"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle10gDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> </props> </property> <property name="packagesToScan"> <list> <value>com/entity</value> </list> </property> </bean> <!-- 2注解配置组件(代表声明开启注解模式,不加的话三个框架整合的话或许有些问题,或许识别不了标注组件@)--> <context:annotation-config /> <!-- 3配置注解的自动扫描范围(多个包配置可配置多个context:component-scan) base-package:需要扫描的包 --> <context:component-scan base-package="com.dao.impl"/> <context:component-scan base-package="com.service.impl"/> <context:component-scan base-package="com.action"/> <!-- 4第二种方法,在dao类中定义一个模板对象,这是外部的类不是我们创建的,所以要写在这里,如果不写,dao.iml中就找不到此模型 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory" ></property> </bean> <!-- (1)配置注解事务管理器 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- (2)加入注解事务管理器 --> <tx:annotation-driven transaction-manager="txManager"/> </beans>
配置struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 是否启动动态方法调用 <constant name="struts.enable.DynamicMethodInvocation"value="false" /> --> <!-- 开启开发者模式,作用,页面中报错信息会更加详细,默认false --> <constant name="struts.devMode" value="true" /> <!-- 指定由spring负责action对象的创建(必选) --> <constant name="struts.objectFactory" value="spring" /> <!-- 国际化设置,请求参数为utf-8编码(必选) --> <constant name="struts.i18n.encoding" value="utf-8" /> <!-- 指定被struts2处理的请求后缀类型,如果有多个,用逗号隔开 <constant name="struts.action.extension" value="action" /> --> <!-- 指定上传文件的大小上限 <constant name="struts.multipart.maxSize" value="209715200" /> --> <!-- 当配置文件改动后是否重新加载,生产环境下需要设置为false <constant name="struts.configuration.xml.reload" value="false" /> --> <!-- 是否使用struts2的开发模式,生产环境下需要设置为false <constant name="struts.devMode" value="false" /> --> <!-- 浏览器是否缓存静态内容,生产环境下需要设置为true <constant name="struts.serve.static.browserCache" value="true" /> --> <!-- <includefile="example.xml"/> --> </struts>
数据访问层dao接口:
package com.dao; import com.entity.Users; /** * 用户接口 * @author asus * */ public interface UsersDao { /** 登陆验证 */ Users loginCheck(Users user); /** 添加的方法 */ int addUser(Users user); }
数据访问层dao.impl实现类:
package com.dao.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Repository; import com.dao.UsersDao; import com.entity.Users; /** * 用户接口实现类 * @author asus *HibernateTemplate、HibernateDaoSupport两种方法实现增删改查 *第二种方法:(第一种在《SSH(Struts2+Spring+Hibernate)框架搭建流程》中有详细介绍) 在dao类中定义一个HibernateTemplate类的对象,用该对象调用HibernateTemplate模板封装好的方法,如下: */ @Repository(value="usersDaoImpl")//用于标注数据访问组件,即DAO组件,value属性可不写默认是类名首字母小写(观看顺序1) public class UsersDaoImpl implements UsersDao { //定义一个模板对象(使用注解不需要生成Get'Set方法,属性名必须类名首字母小写才能注解方式自动赋值) //@Autowired//注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,抛出异常,这样的话就不友好了不是,所有Spring提供了一个配套使用的@Qualifier(完全自动) //@Qualifier(value="hibernateTemplate")//指定注入 Bean 的名称与@Autowired配套使用 @Resource(name="hibernateTemplate")//spring组件setter方法注入(观看顺序2) private HibernateTemplate hibernateTemplate; @Override public Users loginCheck(Users user) { //得到一个集合 List<Users> list = hibernateTemplate.find("from Users where name=? and password=? ",user.getName(),user.getPassword()); //使用三元运算符,防止list.get(0)时报空指针。 return (Users) (list.size()>0?list.get(0):null); } @Override public int addUser(Users user) { try { hibernateTemplate.save(user); return 1; } catch (DataAccessException e) { e.printStackTrace(); } return 0; } }
业务逻辑层接口service:
package com.service; import com.entity.Users; /** * 用户业务逻辑层 * @author asus * */ public interface UsersService { /** 登陆验证 */ Users loginCheck(Users user); /** 添加的方法 */ int addUser(Users user); }
数据访问层dao.impl实现类:
package com.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.dao.UsersDao; import com.entity.Users; import com.service.UsersService; /** * 用户业务逻辑层实现类 * @author asus * */ //@Transactional //给实现类的所有添加事务(也可以个某一个方法添加此标注) @Service(value="usersServiceImpl")//用于标注业务层组件(观看顺序3) public class UsersServiceImpl implements UsersService { //这里以前是new的,现在不需要了,交给Spring来实例(使用注解不需要生成Get'Set方法) @Resource(name="usersDaoImpl")//spring组件setter方法注入(观看顺序4) private UsersDao udd; @Override public Users loginCheck(Users user) { return udd.loginCheck(user); } @Transactional//给单个方法添加事物(若类上添加了全体事物,则不需要添加此局部事物) @Override public int addUser(Users user) { return udd.addUser(user); } }
控制器类Action:
package com.action; import javax.annotation.Resource; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.entity.Users; import com.opensymphony.xwork2.ActionSupport; import com.service.UsersService; /** * 用户控制器类 * @author asus * */ //Action类[观看顺序5] @Controller(value="usersAction")//用于标注控制层组件(如struts中的action) @Scope("prototype")//单列模式 @ParentPackage("struts-default") @Namespace("/") /* Results({}):集合,对应的结果有多个 * Result():一个结果 * name:Action return返回的值 * location:返回结果的页面 */ @Results({ @Result(name="success",location="/success.jsp"), @Result(name="login",location="/login.jsp"), @Result(name="register",location="/register.jsp") }) public class UsersAction extends ActionSupport { //接收页面的值 private Users user; //一样交给Spring实例(使用注解不需要生成Get'Set方法) @Resource(name="usersServiceImpl")//spring组件setter方法注入(观看顺序6) private UsersService uss; public String execute(){ return SUCCESS; } /** 判断用户输入的账号密码 */ @Action("loginUser")//相当于sturts.xml中的action标签的name,表单提交的url地址(观看顺序7) public String login(){ Users checkNum=null; if(user!=null){ checkNum = uss.loginCheck(user); } return checkNum==null?LOGIN:SUCCESS; } /** 添加用户 */ @Action("addUser") public String add(){ int addResult=0; if(user!=null){ addResult = uss.addUser(user); } return addResult==0?"register":SUCCESS; } //生成Get'Set public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
登陆页面:
<body> <form action="loginUser.action" method="post" > 用户名:<input type="text" name="user.name" /> 密码: <input type="password" name="user.password" /> <input type="submit" value="登录按钮" > </form> </body>
注册页面:
<body> <form action="addUser.action" method="post"> 用户名: <input type="text" name="user.name"> <br> 密码: <input type="password" " name="user.password"> <br> <input type="submit" value="注册"> </form> </body>
成功页面:
<body> 操作成功! </body>