目的:

  通过对ssh框架有了基础性的学习,本文主要是使用注解的方式来简化ssh框架的代码编写。

注意事项:

    1.运行环境:Windows 8-64位,Eclipse(开发工具),jdk1.8.0_91,Tomcat 8.0,struts-2.3.30-apps,spring-framework-4.2.2.RELEASE,hibernate-release-5.2.2.Final,mysql数据库

     2.问:既然说是简化版那么到底简化了哪些呢?

       答:①原来的属性set注入改为注解

         ②原来的Connection(连接数据库)包改为jdbc.properties文件配置

         ③由于加入hibernate之后我们不需要创建表,但是向数据库里插入数据还是得自己写,以下就是插入语句:

  1. use news;
    insert into news(title,content,begintime,username) values('美国之死','如何干掉美国...','2012-03-01','xiaowen');
  2. insert into news(title,content,begintime,username) values('美国之死2','如何干掉美国2...','2012-03-02','xiaohong');
  3. insert into news(title,content,begintime,username) values('美国之死3','如何干掉美国3...','2012-03-03','xiaochen');

文件总序:

src目录:

WEB-INF目录下:

(开始)

一.  在eclipse右键新建一个项目并勾上生成web.xml文件

二.导入struts、spring、hibernate  相关jar包(具体可看第一篇ssh框架)

地址:未简化版ssh(struts2+spring+hibernate)框架搭建

三.在WEB-INF目录下的web.xml文件配置过滤器(struts2)和监听器(spring)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  3. <display-name>news</display-name>
  4. <welcome-file-list>
  5. <welcome-file>default.jsp</welcome-file>
  6. </welcome-file-list>
  7.  
  8. <!-- struts2过滤器 -->
  9. <filter>
  10. <filter-name>struts2</filter-name>
  11. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>struts2</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17.  
  18. <!-- spring监听器 -->
  19. <context-param>
  20. <param-name>contextConfigLocation</param-name>
  21. <param-value>classpath:applicationContext.xml</param-value>
  22. </context-param>
  23. <listener>
  24. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  25. </listener>
  26. </web-app>

四.在项目新建四个包

五.在news.dao包中新建一个接口(interface):

  1. package news.dao;
  2.  
  3. import java.util.List;
  4.  
  5. public interface NewsDao {
  6. public List showAllNews();
  7. //显示首页所有数据(查询使用的。PS:本例没用到)
  8. public String findNews();
  9. public String deleteSingleNews(Integer id);
  10. }

六.在news.dao包新建一个类NewsDaoImpl实现NewsDao接口

  1. package news.dao;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import javax.annotation.Resource;
  7.  
  8. import org.hibernate.Session;
  9. import org.hibernate.SessionFactory;
  10. import org.hibernate.query.Query;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.beans.factory.annotation.Qualifier;
  13. import org.springframework.context.annotation.Scope;
  14. import org.springframework.stereotype.Repository;
  15.  
  16. import news.entity.News;
  17.  
  18. //@Repository("myNewsDao")
  19. @Repository
  20. @Scope("prototype")
  21. public class NewsDaoImpl implements NewsDao {
  22.  
  23. @Autowired
  24. //@Qualifier("mySessionFactory")
  25. //@Resource(name="mySessionFactory")
  26. private SessionFactory sf;
  27.  
  28. @Override
  29. public List showAllNews() {
  30. Session session = sf.openSession();
  31. session.getTransaction().begin();
  32.  
  33. Query query = session.createQuery("from News");
  34.  
  35. List<News> allNewList = query.getResultList();
  36.  
  37. session.getTransaction().commit();
  38. session.close();
  39.  
  40. return allNewList;
  41. }
  42.  
  43. @Override
  44. public String findNews() {
  45. return null;
  46. }
  47.  
  48. @Override
  49. public String deleteSingleNews(Integer id) {
  50. Session session = sf.openSession();
  51. //Session session = sf.getCurrentSession();//它会与事务关联,并且在事务后自动关闭
  52. Query query = session.createQuery("from News where id=:myid");
  53.  
  54. query.setParameter("myid", id);
  55. List<News> deleteList = query.getResultList();
  56. //如果搜索出来是1条,就删除,如果是0条就不管了
  57. if ( deleteList.size()==1 ) {
  58. News news = deleteList.get(0);
  59. System.out.println("删除对象:"+news.getTitle()+ " Id:"+news.getId());
  60. session.getTransaction().begin();
  61. session.delete(news);
  62. session.getTransaction().commit();
  63. session.close();
  64. //sessionFactory关闭策略
  65. //1.坚持使用数据库连接池(例如C3P0)
  66. //2.sessionFactory就不关闭,而使用hibernate事务自动关闭功能
  67. // 说明:sf.openSession(); 必须关闭
  68. // sf.openSession(); 改为:sf.getCurrentSession();
  69. //getCurrentSession创建的线程会在事务提交或者事务回滚后自动关闭
  70. //sf.close();
  71. }
  72.  
  73. return "deleteOK";
  74. }
  75.  
  76. }

  注意:原来的spring  setter注入,改为注解

七. 在news.service包中新建一个接口NewsServic

  1. package news.service;
  2.  
  3. import java.util.List;
  4.  
  5. public interface NewsService {
  6. public List showAllNews();
  7. public String findNews();
  8. public String deleteSingleNews(Integer id);
  9. }

  

八.在news.service包中新建一个类实现NewsService接口

  1. package news.service;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.annotation.Resource;
  6.  
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.beans.factory.annotation.Qualifier;
  9. import org.springframework.context.annotation.Scope;
  10. import org.springframework.stereotype.Service;
  11.  
  12. import news.dao.NewsDao;
  13. import news.entity.News;
  14.  
  15. //@Service("myNewsService")
  16. @Service
  17. @Scope("prototype")
  18. public class NewsServiceImpl implements NewsService {
  19.  
  20. //Autowired和Qualifier 属于spring的注解,
  21.  
  22. //jdk自带注解resource可以替代Autowired
  23. /*
  24. * 用resource的好处:
  25. * 1. 代码与spring 解耦,不依赖于spring
  26. * 2. 代码中没有spring的存在,可以随时切换任意一套类似spring的框架
  27. */
  28. @Autowired
  29. //@Qualifier("myNewsDao")
  30. //@Resource(name="myNewsDao")
  31. private NewsDao nd;
  32.  
  33. @Override
  34. public List showAllNews() {
  35. //可以增加一个业务逻辑,比如:把文章的内容进行截取为20字符
  36. //通过DAO获取数据
  37. List<News> allNewList = nd.showAllNews();
  38. //在return 之间,可以进行各种业务逻辑操作
  39.  
  40. return allNewList;
  41. }
  42.  
  43. @Override
  44. public String findNews() {
  45. // TODO Auto-generated method stub
  46. return null;
  47. }
  48.  
  49. @Override
  50. public String deleteSingleNews(Integer id) {
  51. //需要做以下判断,例如有没有权限删除,又或者判断下面是否有级联子子记录
  52.  
  53. //当可以删除时,调用DAO给直接删除
  54. String returnValue = "deleteFailed";
  55. returnValue = nd.deleteSingleNews(id);
  56. // TODO Auto-generated method stub
  57. return returnValue;
  58. }
  59.  
  60. }

  

九.在news.action包中新建一个NewsAction类

  1. package news.action;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.annotation.Resource;
  6.  
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.beans.factory.annotation.Qualifier;
  9. import org.springframework.context.annotation.Scope;
  10. import org.springframework.stereotype.Controller;
  11.  
  12. import com.opensymphony.xwork2.ActionSupport;
  13.  
  14. import news.entity.News;
  15. import news.service.NewsService;
  16.  
  17. //@Controller("myNewsAction")
  18. @Controller //默认就是类的首字母小写newsAction
  19. @Scope("prototype")
  20. public class NewsAction extends ActionSupport {
  21.  
  22. private String message;
  23.  
  24. public String getMessage() {
  25. return message;
  26. }
  27.  
  28. public void setMessage(String message) {
  29. this.message = message;
  30. }
  31.  
  32. //获取从客户端传递过来的值
  33. private Integer id;
  34. public Integer getId(){
  35. return this.id;
  36. }
  37.  
  38. //strtus自动的赋值
  39. public void setId(Integer id) {
  40. this.id = id;
  41. }
  42.  
  43. @Autowired
  44. //@Qualifier("myNewsService")
  45. //@Resource(name="myNewsService")
  46. private NewsService ns;
  47.  
  48. //定义1个list用于前端jsp显示
  49. private List<News> allNewList;
  50.  
  51. public List<News> getAllNewList() {
  52. return allNewList;
  53. }
  54.  
  55. //显示首页所有数据
  56. public String showAllNews(){
  57. //调用service 中的showAllNews,获取所有的数据,
  58. //然后保存到
  59. allNewList = ns.showAllNews();
  60. return "success";
  61. }
  62.  
  63. //显示首页所有数据(查询使用的。PS:本例没用到)
  64. public String findNews(){
  65. return "";
  66. }
  67.  
  68. public String deleteSingleNews(){
  69. System.out.println("从客户端传递过来的ID:"+id);
  70. String returnValue = ns.deleteSingleNews(id);
  71. return returnValue;
  72. }
  73.  
  74. }

  

十.在webcontent目录下新建一个default.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%><%
  3.  
  4. response.sendRedirect("NewsAction_showAllNews.action");
  5. %>

  

十一.在src目录下创建struts.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <constant name="struts.objectFactory" value="spring" />
  7.  
  8. <!-- 第1步:先定义一个包 -->
  9. <package name="mypck001" extends="struts-default">
  10. <action name="NewsAction_*" class="newsAction" method="{1}">
  11. <result name="success">/WEB-INF/jsp/index.jsp</result>
  12. <!-- 希望删除成功后,重新执行1次首页显示内容 -->
  13. <result name="deleteOK" type="redirectAction">NewsAction_showAllNews.action?message=deleteok&amp;id=${id}</result>
  14. </action>
  15.  
  16. </package>
  17. </struts>

十二.在src目录下新建一个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" xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
  10. http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd
  11. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
  12.  
  13. <!-- 原理:自动注入processor解析器,用来解析注解 -->
  14. <!--
  15. <context:annotation-config/>
  16. -->
  17.  
  18. <!-- 自动扫描包,也会自动注入解释器,所以不需要 context:annotation-config-->
  19. <context:component-scan base-package="news"></context:component-scan>
  20.  
  21. <!-- 引入外部属性文件 -->
  22. <context:property-placeholder location="classpath:jdbc.properties" />
  23.  
  24. <bean id="sessionFactory"
  25. class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  26. <!-- 注入连接池,包含了数据库用户名,密码等等信息 -->
  27. <property name="dataSource" ref="myDataSource" />
  28.  
  29. <!-- 配置Hibernate的其他的属性 -->
  30. <property name="hibernateProperties">
  31. <props>
  32. <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
  33. <prop key="hibernate.show_sql">true</prop>
  34. <prop key="hibernate.format_sql">true</prop>
  35. <prop key="hibernate.connection.autocommit">false</prop>
  36. <!-- 开机自动生成表 -->
  37. <prop key="hibernate.hbm2ddl.auto">update</prop>
  38. </props>
  39. </property>
  40. <property name="mappingResources">
  41. <list>
  42. <value>news/entity/News.hbm.xml</value>
  43. </list>
  44. </property>
  45.  
  46. </bean>
  47.  
  48. <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  49. <property name="driverClass" value="${jdbc.driver}" />
  50. <property name="jdbcUrl" value="${jdbc.url}" />
  51. <property name="user" value="${jdbc.user}" />
  52. <property name="password" value="${jdbc.password}" />
  53. <!-- 每300秒检查所有连接池中的空闲连接 -->
  54. <property name="idleConnectionTestPeriod" value="300"></property>
  55. <!-- 最大空闲时间,900秒内未使用则连接被丢弃。若为0则永不丢弃 -->
  56. <property name="maxIdleTime" value="900"></property>
  57. <!-- 最大连接数 -->
  58. <property name="maxPoolSize" value="2"></property>
  59.  
  60. </bean>
  61.  
  62. </beans>

十三.在news.entity包中新建一个映射文件News.hbm.xml(实体类和数据库表的映射)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping">
  3.  
  4. <class name="news.entity.News" table="news">
  5. <id name="id" column="id">
  6. <generator class="native"></generator>
  7. </id>
  8. <property name="title" type="string" length="50" column="title" not-null="true"></property>
  9. <property name="content" type="text" length="50000" column="content" not-null="true"></property>
  10. <property name="begintime" type="date" column="begintime" not-null="true"></property>
  11. <property name="username" type="string" length="20" column="username" not-null="true"></property>
  12. </class>
  13. </hibernate-mapping>

  

十四.在src目录下配置jdbc.properties(外部属性文件)

  1. <!-- mysql数据库 -->
    jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/news
  3. jdbc.user=root
  4. jdbc.password=123456
  5.  
  6. <-- oracle数据库 -->
  7. #oracle
  8. jdbc_oracle.driver=oracle.jdbc.driver.OracleDriver
  9. jdbc_oracle.url=jdbc:oracle:thin@127.0.0.1:1521:orcl
  10. jdbc_oracle.user=news
  11. jdbc_oracle.password=123456

  

十五.在WEB-INF目录下新建一个jsp(folder),并且在jsp下新建三个jsp文件

error_delete.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. 删除失败,原因:xxxxx
  11. </body>
  12. </html>

index.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11.  
  12. 提示信息:<s:property value="message"/>
  13. 删除id:<s:property value="id"/>
  14. <br><br><br><br>
  15.  
  16. <s:iterator value="allNewList">
  17. <s:property value="id"/>
  18. <s:property value="title"/>
  19. <s:a value="NewsAction_deleteSingleNews?id=%{id}">删除</s:a>
  20. <br>
  21. </s:iterator>
  22. </body>
  23. </html>

  

ok.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. ok
  11. </body>
  12. </html>

  

运行后的效果:

(结束)

SSH框架简化(struts2+spring+hibernate)的更多相关文章

  1. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSH框架(Struts2+Spring+Hibernate)搭建整合详细步骤

    在实际项目的开发中,为了充分利用各个框架的优点,通常都会把 Spring 与其他框架整合在一起使用. 整合就是将不同的框架放在一个项目中,共同使用它们的技术,发挥它们的优点,并形成互补.一般而言,在进 ...

  2. struts2+spring+hibernate(SSH)框架的搭建和总结

    SSH框架:struts2+spring+hibernate,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. struts2+spring+hibernat ...

  3. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  4. SSH面试题(struts2+Spring+hibernate)

    struts2 + Spring +hibernate Hibernate工作原理及为什么要用?   原理:   1.读取并解析配置文件   2.读取并解析映射信息,创建SessionFactory ...

  5. Struts2+Spring+Hibernate 三大框架的合并集成

    这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样.  首先看一 ...

  6. Struts2,Spring,Hibernate框架的优缺点

    Struts2,Spring,Hibernate框架的优缺点 Struts2框架(MVC框架)的优点如下:         1)  实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现:   ...

  7. 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建

    1. 前言 基于Maven的开发方式开发项目已经成为主流.Maven能很好的对项目的层次及依赖关系进行管理.方便的解决大型项目中复杂的依赖关系.S2SH(Struts2+Spring+Hibernat ...

  8. SSH框架简化

    通过对ssh框架有了基础性的学习,本文主要是使用注解的方式来简化ssh框架的代码编写. 注意事项: 1.运行环境:Windows 8-64位,Eclipse(开发工具),jdk1.8.0_91,Tom ...

  9. Spring、Struts2+Spring+Hibernate整合步骤

    所使用的Jar包: Hibernate: Spring(使用MyEclipse自动导入框架功能) Struts2: 注解包和MySql驱动包: 1.配置Hibernate和Spring: <be ...

随机推荐

  1. 在web.config配置中添加xml内容

    在web.config 中添加需要的内容时, 就是在<configuration>节点内添加一个新的<configSections>元素, 在configSections元素中 ...

  2. 自己动手做logo

    本文主要记录用 coreDraw 和ps 做公司logo . 我修改的logo.效果还不错. 1 矢量图 和位图的区别 http://jingyan.baidu.com/article/54b6b9c ...

  3. [Python]logging模块使用basicConfig后记录日志重复问题

    logging.basicConfig配置日志记录到文件A后,再使用logging.FileHandler生成记录到文件B的logger 在使用此logger记录日志时,会同时记录的文件A和文件B,感 ...

  4. 随感一:android handler传值更改ui

    handler+looper传值更改activity的UI 博客开了一段时间,一直想写点自己的学习经验及体会,等着以后长时间不用再要用到的时候直接拿过来上手.想了想,之前用到handler, 看了几篇 ...

  5. nosql->redis学习 数据类型

    redis->string 二进制 setnx name lijie  判断键值 是否存在  如果存在返回0 不存在 吧值设置进去   setex  指定键值有效期时间  setex name ...

  6. Xor && 线性基练习

    #include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...

  7. Java多线程(转)

    文章转自http://286.iteye.com/blog/2292038 谢谢博主的总结! 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位, ...

  8. MySQL知识树-查询语句

    在日常的web应用开发过程中,一般会涉及到数据库方面的操作,其中查询又是占绝大部分的.我们不仅要会写查询,最好能系统的学习下与查询相关的知识点,这篇随笔我们就来一起看看MySQL查询知识相关的树是什么 ...

  9. codeforces 723D(DFS)

    题目链接:http://codeforces.com/problemset/problem/723/D 题意:n*m的矩阵中,'*'代表陆地,'.'代表水,连在一起且不沿海的水形成湖泊.问最少填多少块 ...

  10. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...