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>
SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>的更多相关文章
- SSH(Struts2+Spring+Hibernate)框架搭建流程
添加支持 我先介绍的是MyEclipse9的自带框架支持搭建过程:(完全的步骤 傻瓜式的学习..~) 首先我们来搭建一个Web项目: 一.Hibernate(数据层)的搭建: 相关描述 Ⅰ.服务器与数 ...
- 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建
1. 前言 基于Maven的开发方式开发项目已经成为主流.Maven能很好的对项目的层次及依赖关系进行管理.方便的解决大型项目中复杂的依赖关系.S2SH(Struts2+Spring+Hibernat ...
- Struts2,Spring,Hibernate框架的优缺点
Struts2,Spring,Hibernate框架的优缺点 Struts2框架(MVC框架)的优点如下: 1) 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现: ...
- 深入浅出Struts2+Spring+Hibernate框架
一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...
- Struts2+Spring+Hibernate框架整合总结详细教程
一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSH框架(Struts2+Spring+Hibernate)搭建整合详细步骤
在实际项目的开发中,为了充分利用各个框架的优点,通常都会把 Spring 与其他框架整合在一起使用. 整合就是将不同的框架放在一个项目中,共同使用它们的技术,发挥它们的优点,并形成互补.一般而言,在进 ...
- 三大框架SSH(struts2+spring+hibernate)整合时相关配置文件的模板
最近在学SSH三大框架的整合,在此对他们整合时相关配置文件做一简单的模板总结,方便以后复用! 首先是web.xml配置文件,这里面就配置一些简单的监听器.过滤器,包括spring核心配置文件appli ...
- java三大框架SSH(Struts2 Spring Hibernate)
http://www.cnblogs.com/qiuzhongyang/p/3874149.html
- Struts2 + Spring + hibernate 框架搭成实例
1.准备Jar包: struts2.hibernate.spring所需jar包 struts-core-2.x.x.jar ----struts核心包 xwork-core-2.x.x.jar ...
随机推荐
- 入手Invicta 8926 OB潜水自动机械腕表
前个月前就想入手一款手表了,之前在关注和学习.询问他人选哪样的表好,前些天还在看精工Seiko机械表系列,今凌晨有朋友给我推荐这款Invicta 8926系列手表,我一看便喜欢了. 在网上也是搜索了很 ...
- MyEclipse打开 HTML 报错Failed to create the part's controls
拷贝代码时有时会弹出这个错误,页面仍然可以访问,但是无法编辑很郁闷. MyEclipse默认打开编辑页面是MyEclipse visual html designer 右击html页面选择open ...
- 使用JavaMail创建邮件发送邮件
一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...
- java中对final关键字的理解以及使用场景
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.
- WebDriver--操控浏览器
前一篇讲述了元素的定位方法,现在开始练习如何写自动化测试脚本 我使用的编辑工具是PyCharm,今后该博客中所写的有关Python脚本,都是在该工具中编写的. WebDriver提供了控制浏览器大小. ...
- OpenCASCADE Conic to BSpline Curves-Hyperbola
OpenCASCADE Conic to BSpline Curves-Hyperbola eryar@163.com Abstract. Rational Bezier Curve can repr ...
- Android音频开发之MediaRecorder/MediaPlayer
前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...
- 记录一则ORA-00054,ORA-00031解决过程
生产环境:AIX 5.3 + Oracle 10.2.0.5 任务要求:普通表改造分区表,历史数据不要 这个需求很简单: pl/sql导出建表语句,依次修改成分区的建表语句,注意将索引修改成本地索 ...
- DotNet程序集解析
在.NET Framework框架中,程序集是重用.安全性以及版本控制的最小单元.程序集的定义为:程序集是一个或多个类型定义文件及资源文件的集合.程序集主要包含:PE/COFF,CLR头,元数据,清单 ...
- N[开源].NET CORE与MySql更配, MySqlSugar ORM框架 3.x
MySqlSugar 3.X API 作为支持.NET CORE 为数不多的ORM之一,除了具有优越的性能外,还拥有强大的功能,不只是满足你的增,删,查和改.实质上拥有更多你想像不到的功能,当你需要实 ...