用注解实现ssh的例子

在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。个人也不喜欢配置那么多的xml文件。下面我们就利用java的注解实现ssh框架,注解相当于一种标记加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具包和其他程序可以用反射来了解你的类以及各种元素上有何种标记,看你有什么标记,就去干相应的事,标记可以加载包,类,字段,方法,方法的参数以及局部变量上。关于注解在这里不多说,网上大把资料。

先看看完整的工程目录吧

1.为了使用注解我们需要配置web.xml文件,在web-inf目录下内容如下


  
  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns= "http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <!-- 加载spring配置文件 -->
  8. <context-param>
  9. <param-name>contextConfigLocation </param-name>
  10. <param-value>
  11. classpath*:applicationContext*.xml
  12. </param-value>
  13. </context-param>
  14. <listener>
  15. <listener-class>
  16. org.springframework.web.context.ContextLoaderListener
  17. </listener-class>
  18. </listener>
  19. <!-- struts2 的配置 -->
  20. <filter>
  21. <filter-name>struts2 </filter-name>
  22. <filter-class>
  23. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  24. </filter-class>
  25. <init-param>
  26. <!-- //固定格式-->
  27. <param-name>actionPackages </param-name>
  28. <param-value>com.ssh </param-value>
  29. </init-param>
  30. </filter>
  31. <filter-mapping>
  32. <filter-name>struts2 </filter-name>
  33. <url-pattern>/* </url-pattern>
  34. </filter-mapping>
  35. <display-name> </display-name>
  36. <welcome-file-list>
  37. <welcome-file>index.jsp </welcome-file>
  38. </welcome-file-list>
  39. </web-app>


2.接下来看看spring和hibernate的配置文件applicationContext.xml


  
  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context= "http://www.springframework.org/schema/context"
  5. xmlns:aop= "http://www.springframework.org/schema/aop"
  6. xmlns:tx= "http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation= "
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop.xsd
  14. http://www.springframework.org/schema/tx
  15. http://www.springframework.org/schema/tx/spring-tx.xsd">
  16. <!-- 使用 annotation -->
  17. <context:annotation-config />
  18. <!-- 使用 annotation 自动注册bean,并检查@Controller, @Service, @Repository注解已被注入 -->
  19. <context:component-scan base-package="com.ssh" />
  20. <!-- 数据库配置 -->
  21. <bean id="dataSource"
  22. class= "org.apache.commons.dbcp.BasicDataSource">
  23. <property name="driverClassName"
  24. value= "com.mysql.jdbc.Driver">
  25. </property>
  26. <property name="url"
  27. value= "jdbc:mysql://localhost:3306/myssh">
  28. </property>
  29. <property name="username" value="anan"> </property>
  30. <property name="password" value="123456"> </property>
  31. </bean>
  32. <!-- sessionFactory -->
  33. <bean id="sessionFactory"
  34. class= "org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  35. <property name="dataSource">
  36. <ref bean="dataSource" />
  37. </property>
  38. <property name="hibernateProperties">
  39. <props>
  40. <prop key="hibernate.dialect">
  41. org.hibernate.dialect.MySQLDialect
  42. </prop>
  43. <prop key="hibernate.show_sql">true </prop>
  44. <!-- 可以自动创建数据库表(create),不创建(none) -->
  45. <prop key="hibernate.hbm2ddl.auto">update </prop>
  46. </props>
  47. </property>
  48. <!-- 包扫描的方式加载注解类(推荐) -->
  49. <property name="packagesToScan">
  50. <list>
  51. <value>com.ssh.* </value>
  52. </list>
  53. </property>
  54. </bean>
  55. <!--JDBC事务管理器,根据你的情况使用不同的事务管理器,如果工程中有Hibernate,就用Hibernate的事务管理器 -->
  56. <bean id="transactionManager"
  57. class= "org.springframework.jdbc.datasource.DataSourceTransactionManager">
  58. <property name="dataSource">
  59. <ref local="dataSource" />
  60. </property>
  61. </bean>
  62. <!-- 用注解来实现事务管理 -->
  63. <tx:annotation-driven transaction-manager="transactionManager" />
  64. </beans>


基本都有注释了,这里不多说了,需要注意的是如果是自己搞回去用千万记得要改上面的数据库配置。

3.接下来我们再看看struts的配置文件struts.xml


  
  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
  3. <struts>
  4. <!-- 开启使用开发模式,详细错误提示 -->
  5. <constant name="struts.devMode" value="false" />
  6. <!-- 将对象交给spring管理 -->
  7. <constant name="struts.objectFactory" value="spring" />
  8. <!-- 指定资源编码类型 -->
  9. <constant name="struts.i18n.encoding" value="UTF-8" />
  10. <!-- 指定每次请求到达,重新加载资源文件 -->
  11. <constant name="struts.i18n.reload" value="false" />
  12. <!-- 指定每次配置文件更改后,自动重新加载 -->
  13. <constant name="struts.configuration.xml.reload" value="false" />
  14. <!-- 默认后缀名 -->
  15. <!-- <constant name="struts.action.extension" value="do,action,jhtml,," /> -->
  16. <!-- Struts Annotation -->
  17. <!-- <constant name="actionPackages" value="com.test1"/> -->
  18. </struts>

基本上注释写的很详细了吧,我也不是很懂就那样配置着先....

接下来我们就可以安心的写java代码了,先创建如下图所示的包和类

先看看实体类User.java


  
  
  1. package com.ssh.user.model;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. /**
  9. * 类名称:User
  10. * 类描述:用户信息实体
  11. * 创建人:anan
  12. * 创建时间:2012-12-21 下午10:55:19
  13. * 修改人:anan
  14. * 修改时间:2012-12-21 下午10:55:19
  15. * 修改备注:
  16. * @version
  17. * */
  18. @Entity
  19. @Table(name = "user")
  20. public class User {
  21. /**
  22. * 用户id
  23. */
  24. @Id
  25. @Column(name = "userId")
  26. @GeneratedValue(strategy = GenerationType.IDENTITY)
  27. private int userId;
  28. /**
  29. * 用户名
  30. */
  31. @Column(name = "userName", length = 50)
  32. private String userName;
  33. /**
  34. * 用户登录密码
  35. */
  36. @Column(name = "passWord", length = 50)
  37. private String passWord;
  38. public int getUserId() {
  39. return userId;
  40. }
  41. public void setUserId(int userId) {
  42. this.userId = userId;
  43. }
  44. public String getUserName() {
  45. return userName;
  46. }
  47. public void setUserName(String userName) {
  48. this.userName = userName;
  49. }
  50. public String getPassWord() {
  51. return passWord;
  52. }
  53. public void setPassWord(String passWord) {
  54. this.passWord = passWord;
  55. }
  56. public User(int userId, String userName, String passWord) {
  57. this.userId = userId;
  58. this.userName = userName;
  59. this.passWord = passWord;
  60. }
  61. public User(String userName, String passWord) {
  62. this.userName = userName;
  63. this.passWord = passWord;
  64. }
  65. public User(int userId) {
  66. this.userId = userId;
  67. }
  68. public User() {
  69. }
  70. }


这是一个基本的pojo类,关键看看那几个注解@Entity表示当前类是一个实体,@Table(name = "user")指定这个类映射到数据库的哪一个表,@Column(name = "userId")表示这个属性映射数据库对应表中的那一列...


接下来看看UserDao.java


  
  
  1. package com.ssh.user.dao;
  2. import java.util.List;
  3. import com.ssh.user.model.User;
  4. /**
  5. * 类名称:UserDao
  6. * 类描述:用户控制dao实现数据库操作接口
  7. * 创建人:anan
  8. * 创建时间:2012-12-21 下午11:05:46
  9. * 修改人:anan
  10. * 修改时间:2012-12-21 下午11:05:46
  11. * 修改备注:
  12. * @version
  13. * */
  14. public interface UserDao {
  15. public void addUser(User user);
  16. public void delUser(int userId);
  17. public void updateUser(User user);
  18. public List<User> selectUser();
  19. public User getUserByUserId(int userId);
  20. public boolean isExitByName(String userName);
  21. public boolean isExitByNameAndPass(User user);
  22. }


这是一个接口指定用户操作,定义一些方法

接下来具体实现这些方法,看UserDaoImpl.java


  
  
  1. package com.ssh.user.dao.impl;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import org.hibernate.Session;
  6. import org.hibernate.Transaction;
  7. import org.springframework.stereotype.Repository;
  8. import com.ssh.user.dao.UserDao;
  9. import com.ssh.user.model.User;
  10. import com.ssh.util.MyHibernateDaoSupport;
  11. /**
  12. * 类名称:UserDaoImpl
  13. * 类描述:用户控制dao实现数据库操作接口实现
  14. * 创建人:anan
  15. * 创建时间:2012-12-21 下午11:07:43
  16. * 修改人:anan
  17. * 修改时间:2012-12-21 下午11:07:43
  18. * 修改备注:
  19. * @version
  20. * */
  21. @Repository( "userDao")
  22. public class UserDaoImpl extends MyHibernateDaoSupport implements UserDao{
  23. public void addUser(User user) {
  24. Session session = this.getSession( true);
  25. Transaction tc = (Transaction) session.beginTransaction();
  26. session.save(user);
  27. try {
  28. tc.commit();
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. session.close();
  33. }
  34. public void delUser(int userId) {
  35. Session session = this.getSession( true);
  36. Transaction tc = (Transaction) session.beginTransaction();
  37. User u = new User(userId);
  38. session.delete(u);
  39. try {
  40. tc.commit();
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. session.close();
  45. }
  46. public void updateUser(User user) {
  47. Session session = this.getSession( true);
  48. Transaction tc = (Transaction) session.beginTransaction();
  49. session.update(user);
  50. try {
  51. tc.commit();
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. }
  55. session.close();
  56. }
  57. public List<User> selectUser() {
  58. List<User> users = new ArrayList<User>();
  59. Session session = this.getSession( true);
  60. Transaction tc = (Transaction) session.beginTransaction();
  61. List list = session.createQuery( "From User").list();
  62. for (Iterator iterator = list.iterator(); iterator.hasNext();) {
  63. User u = (User) iterator.next();
  64. users.add(u);
  65. }
  66. try {
  67. tc.commit();
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. session.close();
  72. return users;
  73. }
  74. public User getUserByUserId(int userId) {
  75. Session session = this.getSession( true);
  76. Transaction tc = (Transaction) session.beginTransaction();
  77. //load 是说明数据库中一定存在这条记录,没有则报出:ObjectNotFoundException
  78. //get 如果查不到记录,返回的是一个null
  79. User user = (User)session.load(User.class, userId);
  80. try {
  81. tc.commit();
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. }
  85. session.close();
  86. return user;
  87. }
  88. public boolean isExitByName(String userName) {
  89. Session session = this.getSession( true);
  90. Transaction tc = (Transaction) session.beginTransaction();
  91. List user = (List)session.createQuery( "From User u where u.userName=:userName").setString( "userName", userName).list();
  92. if(user.size()> 0){
  93. try {
  94. tc.commit();
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. }
  98. session.close();
  99. return true;
  100. }
  101. try {
  102. tc.commit();
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. }
  106. session.close();
  107. return false;
  108. }
  109. public boolean isExitByNameAndPass(User user) {
  110. Session session = this.getSession( true);
  111. Transaction tc = (Transaction) session.beginTransaction();
  112. List users = (List)session.createQuery( "From User u where u.userName=:userName and u.passWord=:passWord").setString( "userName", user.getUserName()).setString( "passWord", user.getPassWord()).list();
  113. if(users.size()> 0){
  114. try {
  115. tc.commit();
  116. } catch (Exception e) {
  117. e.printStackTrace();
  118. }
  119. session.close();
  120. return true;
  121. }
  122. try {
  123. tc.commit();
  124. } catch (Exception e) {
  125. e.printStackTrace();
  126. }
  127. session.close();
  128. return false;
  129. }
  130. }


到这里数据库操作基本搞完,接下来写业务逻辑代码,先看看UserService.java


  
  
  1. package com.ssh.user.service;
  2. import java.util.List;
  3. import com.ssh.user.model.User;
  4. /**
  5. * 类名称:UserService
  6. * 类描述:用户业务逻辑接口
  7. * 创建人:anan
  8. * 创建时间:2012-12-21 下午10:58:32
  9. * 修改人:anan
  10. * 修改时间:2012-12-21 下午10:58:32
  11. * 修改备注:
  12. * @version
  13. * */
  14. public interface UserService {
  15. /**
  16. * 判断用户是否存在
  17. * @param userName
  18. * @return user
  19. * @
  20. * */
  21. public boolean isExitUser(String userName) ;
  22. /**
  23. * 判断用户是否存在
  24. * @param userName passWord
  25. * @return user
  26. * @
  27. * */
  28. public boolean isExitByNameAndPass(User user) ;
  29. /**
  30. * 保存用户
  31. * @param user
  32. * @return boolean
  33. * @
  34. * */
  35. public void save(User user) ;
  36. /**
  37. * 查询所有用户
  38. * @param
  39. * @return List<User>
  40. * @
  41. * */
  42. public List<User> getUsers() ;
  43. /**
  44. * 删除用户
  45. * @param userId
  46. * @return
  47. * @
  48. * */
  49. public void del(int userId) ;
  50. /**
  51. * 修改用户
  52. * @param user
  53. * @return
  54. * @
  55. * */
  56. public void update(User user) ;
  57. /**
  58. * 根据id获得user
  59. * @param userId
  60. * @return user
  61. * @
  62. * */
  63. public User getUserById(int userId) ;
  64. }


这个只是一个接口,定义我们接下来需要的方法。下面是具体的实现类UserServiceImpl.java


  
  
  1. package com.ssh.user.service.Impl;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.transaction.annotation.Propagation;
  6. import org.springframework.transaction.annotation.Transactional;
  7. import com.ssh.user.dao.UserDao;
  8. import com.ssh.user.model.User;
  9. import com.ssh.user.service.UserService;
  10. /**
  11. * 类名称:UserServiceImpl
  12. * 类描述:用户信息操作业务逻辑接口实现
  13. * 创建人:anan
  14. * 创建时间:2012-12-21 下午11:08:18
  15. * 修改人:anan
  16. * 修改时间:2012-12-21 下午11:08:18
  17. * 修改备注:
  18. * @version
  19. * */
  20. @Service
  21. public class UserServiceImpl implements UserService {
  22. @Resource
  23. private UserDao userDao;
  24. public boolean isExitUser(String userName) {
  25. return userDao.isExitByName(userName);
  26. }
  27. public void save(User user) {
  28. userDao.addUser(user);
  29. }
  30. public List<User> getUsers() {
  31. List<User> users = userDao.selectUser();
  32. return users;
  33. }
  34. public void del(int userId) {
  35. userDao.delUser(userId);
  36. }
  37. public void update(User user) {
  38. userDao.updateUser(user);
  39. }
  40. public User getUserById(int userId) {
  41. return userDao.getUserByUserId(userId);
  42. }
  43. public boolean isExitByNameAndPass(User user) {
  44. return userDao.isExitByNameAndPass(user);
  45. }
  46. }


业务逻辑在这里包括了判断用户是否存在,保存用户信息,获取用户信息,删除用户,更新用户信息等

通过上面两个类业务逻辑层也就完成了,接下来写视图控制器,这里只是写了一个简单的登录控制器LoginAction.java


  
  
  1. package com.ssh.user.action;
  2. import javax.annotation.Resource;
  3. import org.apache.struts2.convention.annotation.Action;
  4. import org.apache.struts2.convention.annotation.Result;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. import com.ssh.user.dao.UserDao;
  7. import com.ssh.user.model.User;
  8. /**
  9. * 类名称:LoginAction
  10. * 类描述:用户控制器的实现
  11. * 创建人:anan
  12. * 创建时间:2012-12-21 下午11:17:36
  13. * 修改人:anan
  14. * 修改时间:2012-12-21 下午11:17:36
  15. * 修改备注:
  16. * @version
  17. * */
  18. @Action(value = "loginAction", results = {
  19. @Result(name = "loginSuccess", location = "/loginSuss.jsp"),
  20. @Result(name = "loginFailer", location = "/loginFailer.jsp") })
  21. public class LoginAction extends ActionSupport {
  22. private static final long serialVersionUID = - 2266695172069461659L;
  23. @Resource
  24. private UserDao userDao;
  25. private User user;
  26. public User getUser() {
  27. return user;
  28. }
  29. public void setUser(User user) {
  30. this.user = user;
  31. }
  32. public String login(){
  33. boolean flag = userDao.isExitByNameAndPass(user);
  34. if(flag){
  35. return "loginSuccess";
  36. }
  37. return "loginFailer";
  38. }
  39. }


这个就是控制层。

再写几个jsp文件来测试一下

内容如下:

index.jsp


  
  
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="s" uri="/struts-tags"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>My JSP 'index.jsp' starting page </title>
  12. <meta http-equiv="pragma" content="no-cache">
  13. <meta http-equiv="cache-control" content="no-cache">
  14. <meta http-equiv="expires" content="0">
  15. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  16. <meta http-equiv="description" content="This is my page">
  17. <!--
  18. <link rel="stylesheet" type="text/css" href="styles.css">
  19. -->
  20. </head>
  21. <body>
  22. <s:form action="loginAction!login">
  23. <s:textfield name="user.userName" label="userName"> </s:textfield>
  24. <s:textfield name="user.passWord" label="passWord"> </s:textfield>
  25. <s:submit value="login"> </s:submit>
  26. </s:form>
  27. </body>
  28. </html>


loginFailer.jsp


  
  
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP 'loginFailer.jsp' starting page </title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. <!--
  17. <link rel="stylesheet" type="text/css" href="styles.css">
  18. -->
  19. </head>
  20. <body>
  21. 登录失败 </body>
  22. </html>


loginSuss.jsp


  
  
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP 'loginSuss.jsp' starting page </title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. <!--
  17. <link rel="stylesheet" type="text/css" href="styles.css">
  18. -->
  19. </head>
  20. <body>
  21. 登录成功 <br>
  22. </body>
  23. </html>


启动tomcat我们可以看到数据库自动生成一个user表。我们添加一条记录为下面测试

接下来打开浏览器,输入http://localhost:8080/ssh/可以看到下图页面就可以测试了

觉得使用了ssh结构之后整个工程的层次感就那样出来了。搞鼓一下收获还是蛮大的,基于注解的ssh是比xml方便很多,看大家喜欢吧

源码下地址

http://download.csdn.net/detail/yunji3344/4915649

猜你喜欢

转载自blog.csdn.net/naocanmani/article/details/83510362