您的位置:首页 > 编程语言 > Java开发

MyEclipse10+Struts2.1+Spring3.3+Hibernate3.3全注解框架搭建.docx

2013-06-10 18:33 369 查看
一、新建web项目

1. File-->New-->web project

2. 工程名称:king-back-->点选Java EE 6.0标准

二、添加ssh2支持

1. 添加struts2

工程上点右键-->myeclipse-->add struts capabilites

点选struts2.1-->url模式点选 /*

添加struts2 core lib和struts2 spring lib

新建LoginAction类

packagecom.frank.action;

importcom.opensymphony.xwork2.ActionSupport;

/**

* @author steve frank

*

*/

publicclass LoginAction extends ActionSupport {

private String name;

private String password;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(Stringpassword) {

this.password = password;

}

public String execute() {

if (name.equals("steve")&& password.equals("123"))

return SUCCESS;

else

return INPUT;

}

}

修改struts.xml

<?xmlversion="1.0" encoding="UTF-8" ?>

<!DOCTYPEstruts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>

<package name="default"namespace="/" extends="struts-default">

<actionname="login" class="com.frank.action.LoginAction">

<resultname="success">/success.jsp</result>

<resultname="input">/fail.jsp</result>

</action>

</package>

</struts>

修改index.jsp

<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>

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

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>MyJSP 'index.jsp' starting page</title>

</head>

<body>

<s:form action="login">

<s:textfieldname="name" value="steve"></s:textfield>

<s:textfieldname="password" value="123"></s:textfield>

<s:submit></s:submit>

</s:form>

</body>

</html>

添加success.jsp

<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>

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

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>MyJSP 'success.jsp' starting page</title>

</head>

<body>

<s:text name="password"/>

<hr />

<s:propertyvalue="password" />

<hr />

${password}

<hr />

</body>

</html>

添加fail.jsp

<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>

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

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>MyJSP 'fail.jsp' starting page</title>

</head>

<body>登录失败,用户名或密码错误.

</body>

</html>

当前web.xml如下,直接启动会报spring监听错误,因为刚才已经添加了spring支持struts的lib包。

添加spring监听,重新启动会提示找不到spring配置文件。

2. 添加spring

右键-->myeclipse-->add spring capabilities

勾选spring 3.0 aop lib,spring 3.0 core lib,spring 3.0 persistence corelib,spring 3.0 persistence jdbc lib,spring 3.0 web lib;

点选copy checked library contents to project folder

当前web.xml如下,重新启动tomcat,成功。

打开浏览器,输入http://localhost:8088/king-back,(tomcat端口未修改过的应该为8080),出现如下界面。

直接点击submit,成功跳转到success.jsp,界面如下。

如果修改用户名为frank,如下

点击submit后跳转到fail.jsp如下

3. 添加hibernate

先配置好数据源驱动,如下

右键-->myeclipse-->add hibernate capabilities

点选hibernate 3.3,勾选enable hibernate annotations support;

勾选hibernate 3.3 annotations&entity manager,hibernate 3.3 core lib;

点选copy checked library jars to project folder and add to build-path

点选spring configuration file,交给spring配置数据源

勾选existing spring configuration file

选择配置好的数据源驱动

去掉create seesionfactory class的勾。然后点击完成。

三、数据反向生成

1. 新建文件夹com.frank.model,准备放置生成的实体类和dao类

2. 在项目中新建data.sql文件,内容如下,连接mysql的test库,新建表student

DROPTABLE IF EXISTS `student`;

CREATETABLE `student` (

`id` int(11) NOT NULL,

`name` varchar(20) default NULL,

`role_id` int(11) default NULL,

PRIMARY KEY (`id`)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

------------------------------

--Records of student

-- ----------------------------

INSERTINTO `student` VALUES ('1', '张三', '1');

INSERTINTO `student` VALUES ('2', '李四', '2');

INSERTINTO `student` VALUES ('3', '王五', '1');

SELECT * FROM student;

3. 生成Dao和实体类过程如下

打开Test库,选择student表,右键hibernate reverse engineering

出现如下视图,通过browse选择king-back项目和com.frank.model文件夹

结果如下,

勾选create pojo<> db table mapping informationà点选addhibernate mapping annotations to pojoà保留update hibernate configurationwith mapping resource location;

去掉create abstract class勾;

勾选java data access object(dao) à勾选generate precisefindby methodsà点选spring dao

Id generator 选择native

结果如下

四、编写测试

1. 新建test类

packagetest;

importjava.util.List;

importorg.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

importcom.frank.model.Student;

importcom.frank.model.StudentDAO;

publicclass Test {

public static void main(String[] args){

ApplicationContext context =new ClassPathXmlApplicationContext(

"applicationContext.xml");

StudentDAO dao = (StudentDAO)context.getBean("StudentDAO");

List<Student> list =dao.findAll();

int n = list.size();

for (int i = 0; i < n;i++) {

Student c =list.get(i);

String name =c.getName();

System.out.println(name);

}

}

}

运行结果如下,说明项目基本上是ok的。

2. 修改action类

publicString execute() {

getData();

if(name.equals("steve") && password.equals("123"))

return SUCCESS;

else

return INPUT;

}

private void getData() {

ApplicationContext context =new ClassPathXmlApplicationContext(

"applicationContext.xml");

StudentDAO dao = (StudentDAO)context.getBean("StudentDAO");

List<Student> list =dao.findAll();

int n = list.size();

for (int i = 0; i < n;i++) {

Student c =list.get(i);

String name =c.getName();

System.out.println(name);

}

}

刷新浏览器,查看控制台打印结果。

五、添加注解配置

1. 修改struts.xml

<?xmlversion="1.0" encoding="UTF-8" ?>

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

<struts>

<!-- 开启使用开发模式,详细错误提示-->

<constantname="struts.devMode" value="true" />

<!-- 将对象交给spring管理 -->

<constantname="struts.objectFactory" value="spring" />

<!-- 指定资源编码类型 -->

<constant name="struts.i18n.encoding"value="UTF-8" />

<!-- 指定每次请求到达,重新加载资源文件-->

<constantname="struts.i18n.reload" value="true" />

<!-- 指定每次配置文件更改后,自动重新加载-->

<constantname="struts.configuration.xml.reload" value="false" />

<!-- 国际化资源文件 -->

<constant name="struts.custom.i18n.resources"value="content/Language" />

<!-- 浏览器缓存 -->

<constantname="struts.serve.static.browserCache" value="false" />

<!-- 默认后缀名 -->

<constantname="struts.action.extension" value="do,action,jhtml,,"/>

<!-- Struts Annotation -->

<constantname="actionPackages" value="com.frank.action" />

</struts>

2. 修改LoginAction,在execute方法上添加

@Action(value= "login", results = {

@Result(name =INPUT, location = "/index.jsp"),

@Result(name= SUCCESS, location = "/WEB-INF/content/success.jsp") })

3. action注解完成,可以测试通过,接下来添加service注解等

4. 修改applicationContext.xml

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource">

<propertyname="driverClassName" value="com.mysql.jdbc.Driver">

</property>

<propertyname="url"value="jdbc:mysql://localhost:3306/test"></property>

<propertyname="username" value="root"></property>

<propertyname="password" value="admin"></property>

</bean>

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<propertyname="dataSource">

<refbean="dataSource" />

</property>

<propertyname="hibernateProperties">

<props>

<propkey="hibernate.dialect">

org.hibernate.dialect.MySQLDialect

</prop>

</props>

</property>

<propertyname="annotatedClasses">

<list>

<value>com.frank.model.Student</value>

</list>

</property>

</bean>

<!-- 使用 annotation 自动注册bean,并检查@Controller,@Service, @Repository注解已被注入 -->

<context:component-scanbase-package="com.frank" />

</beans>

5. Service、dao 的接口和实现类

StudentService.java

public interfaceStudentService {

/**

* 根据主键查询Student

* @param id

* @return

*/

public Student findById(Integer id);

}

StudentServiceImpl.java

@Service

public classStudentServiceImpl implements StudentService {

@Resource

private StudentDAO studentDAO;

@Override

public Student findById(Integer id) {

// TODO Auto-generated methodstub

returnstudentDAO.findById(id);

}

}

StudentDAO.java

public interfaceStudentDAO{

public abstract void save(StudenttransientInstance);

public abstract void delete(StudentpersistentInstance);

public abstract StudentfindById(java.lang.Integer id);

public abstract List<Student>findByExample(Student instance);

public abstract ListfindByProperty(String propertyName, Object value);

public abstract List<Student>findByName(Object name);

public abstract List findAll();

public abstract Student merge(StudentdetachedInstance);

public abstract voidattachDirty(Student instance);

public abstract voidattachClean(Student instance);

}

StudentDAOImpl.java

@Repository

public classStudentDAOImpl extends HibernateDaoSupport implements StudentDAO {

private static final Logger log =LoggerFactory

.getLogger(StudentDAOImpl.class);

// property constants

public static final String NAME ="name";

private SessionFactory sessionFacotry;

@Resource

public voidsetSessionFacotry(SessionFactory sessionFacotry) {

super.setSessionFactory(sessionFacotry);

}

protected void initDao() {

// do nothing

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#save(com.frank.model.Student)

*/

@Override

public void save(StudenttransientInstance) {

log.debug("savingStudent instance");

try {

getHibernateTemplate().save(transientInstance);

log.debug("savesuccessful");

} catch (RuntimeException re){

log.error("savefailed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#delete(com.frank.model.Student)

*/

@Override

public void delete(StudentpersistentInstance) {

log.debug("deletingStudent instance");

try {

getHibernateTemplate().delete(persistentInstance);

log.debug("deletesuccessful");

} catch (RuntimeException re){

log.error("deletefailed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#findById(java.lang.Integer)

*/

@Override

public StudentfindById(java.lang.Integer id) {

log.debug("gettingStudent instance with id: " + id);

try {

Student instance =(Student) getHibernateTemplate().get(

"com.frank.model.Student",id);

return instance;

} catch (RuntimeException re){

log.error("getfailed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#findByExample(com.frank.model.Student)

*/

@Override

public List<Student>findByExample(Student instance) {

log.debug("findingStudent instance by example");

try {

List<Student>results = (List<Student>) getHibernateTemplate()

.findByExample(instance);

log.debug("findby example successful, result size: "

+results.size());

return results;

} catch (RuntimeException re){

log.error("findby example failed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#findByProperty(java.lang.String,

* java.lang.Object)

*/

@Override

public List findByProperty(StringpropertyName, Object value) {

log.debug("findingStudent instance with property: " + propertyName

+ ",value: " + value);

try {

String queryString ="from Student as model where model."

+propertyName + "= ?";

returngetHibernateTemplate().find(queryString, value);

} catch (RuntimeException re){

log.error("findby property name failed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#findByName(java.lang.Object)

*/

@Override

public List<Student>findByName(Object name) {

return findByProperty(NAME,name);

}

/*

* (non-Javadoc)

*

* @see com.frank.dao.impl.S#findAll()

*/

@Override

public List findAll() {

log.debug("finding allStudent instances");

try {

String queryString ="from Student";

returngetHibernateTemplate().find(queryString);

} catch (RuntimeException re){

log.error("findall failed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#merge(com.frank.model.Student)

*/

@Override

public Student merge(StudentdetachedInstance) {

log.debug("mergingStudent instance");

try {

Student result =(Student) getHibernateTemplate().merge(

detachedInstance);

log.debug("mergesuccessful");

return result;

} catch (RuntimeException re){

log.error("mergefailed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#attachDirty(com.frank.model.Student)

*/

@Override

public void attachDirty(Studentinstance) {

log.debug("attachingdirty Student instance");

try {

getHibernateTemplate().saveOrUpdate(instance);

log.debug("attachsuccessful");

} catch (RuntimeException re){

log.error("attachfailed", re);

throw re;

}

}

/*

* (non-Javadoc)

*

* @seecom.frank.dao.impl.S#attachClean(com.frank.model.Student)

*/

@Override

public void attachClean(Studentinstance) {

log.debug("attachingclean Student instance");

try {

getHibernateTemplate().lock(instance,LockMode.NONE);

log.debug("attachsuccessful");

} catch (RuntimeException re){

log.error("attachfailed", re);

throw re;

}

}

六、附加功能完善

1. 添加log日志输出

log4j.rootLogger=WARN,console, logFile

#Console

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%d%p [%c] - <%m>%n

#RollingFile

log4j.appender.logFile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.logFile.File=../logs/king.log

log4j.appender.logFile.layout=org.apache.log4j.PatternLayout

log4j.appender.logFile.layout.ConversionPattern=%d %p [%c] -<%m>%n

2. 添加编码转换web.xml

<filter>

<filter-name>SetCharacter Encoding</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>SetCharacter Encoding</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

3. 实体类配置修改

<property name="annotatedClasses">

<list>

<value>com.frank.model.Student</value>

</list>

</property>

修改为

<propertyname="packagesToScan" value="com.*.model" />

4. 数据源添加连接池信息

<!-- Connection Pooling Info -->

<propertyname="initialSize" value="5" />

<propertyname="maxActive" value="100" />

<propertyname="maxIdle" value="30" />

<propertyname="maxWait" value="500" />

<propertyname="defaultAutoCommit" value="false" />

5. 添加事务和aop支持

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
6. 配置事务管理

<!-- 配置事务管理 -->

<beanid="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<propertyname="sessionFactory" ref="sessionFactory" />

</bean>

<!-- 配置注解实现管理事务(cglib:proxy-target-class="true") -->

<tx:annotation-driventransaction-manager="transactionManager"

proxy-target-class="true"/>

七、到此,项目搭建已完成,自己可以做一下其它方面的优化和配置,接下来可以做自己喜欢的项目开发了。

不知道为什么word里的“-->”到这里成“à”了,另外图片也没有了。

文库地址:http://wenku.baidu.com/view/7887319a680203d8ce2f2476?fr=prin

代码地址:http://download.csdn.net/detail/steve_frank/5559345
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: