Spring3+SpingMVC+Hibernate4全注解环境配置

我没有使用maven,直接使用Eclipse创建动态Web项目,jar包复制在了lib下。这样做导致我马上概述的项目既依赖Eclipse和其项目结构,又依赖我复制在lib下的那些jar包版本。

jar包下载地址:http://pan.baidu.com/s/1gdARAy3

但是我现在还是会以这种形式阐述,因为对于接触新事物而言的人,我觉得首先需要的是热情,这样才能有勇气面对尝试过程中的失败。热情从哪里来?热情从在事物获得的每一点成就感而来,现在按照以下步骤,我们来获得一点成就感,然后再讨论技术层面的事情(我记得以前刚学Java的时候,如果没有Eclipse那神奇的自动补全,我一定坚持不下来,早就转行了。不切实际的艰苦只能浪费时间和磨练心性,它在某些时候不一定是必要的,它应当成为一个可选项而不是一条必经路)。

环境Spring3.2.0,Hibernate4.1.6,Eclipse 3.7,Tomcat5.5,JDK1.6.45,Oracle10g(不要对我的环境版本搭配和数据库使用抱有异议,我本地恰好就是JDK1.6.45的,恰好Tomcat就是5.5的,恰好Oracle在新建项目前就已经安装好了)。

这是一个SSH项目,所以我假设各位了解或听过一些J2EE的术语,我们将跃过“从入门到精通”系列的引言,直接让你来看看我到底是怎么做的,还有那中间的波折。

首先,我在Eclipse下建立了一个动态Web项目,这时候除了目录结构外,唯一有点内容的就是WEB-INF下的web.xml了,大话不多说,如果你已经把我贴了下载地址的jar包复制到了lib下,那么在web.xml里复制如下内容。

 1 <listener>
2 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
3 </listener>
4
5 <context-param>
6 <param-name>contextConfigLocation</param-name>
7 <!-- <param-value>/WEB-INF/applicationContext.xml</param-value> -->
8 <param-value>classpath:applicationContext.xml</param-value>
9 </context-param>
10 <servlet>
11 <servlet-name>springMVC</servlet-name>
12 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
13 <init-param>
14 <param-name>contextConfigLocation</param-name>
15 <param-value>classpath*:spring-mvc.xml</param-value>
16 </init-param>
17 <load-on-startup>1</load-on-startup>
18 </servlet>
19 <servlet-mapping>
20 <servlet-name>springMVC</servlet-name>
21 <url-pattern>/</url-pattern>
22 </servlet-mapping>
23 <filter>
24 <filter-name>encodingFilter</filter-name>
25 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
26 <init-param>
27 <param-name>encoding</param-name>
28 <param-value>UTF-8</param-value>
29 </init-param>
30 <init-param>
31 <param-name>forceEncoding</param-name>
32 <param-value>true</param-value>
33 </init-param>
34 </filter>
35 <filter-mapping>
36 <filter-name>encodingFilter</filter-name>
37 <url-pattern>/*</url-pattern>
38 </filter-mapping>

Very Nice!现在除了自动的xml头,<welcome-file-list>,就是以上spring配置信息了。这里配置了Spring和SpringMVC,<listener>和contextConfigLocation是对spring的配置,前者是spring的监听类,后者是spring配置文件的路径,这里一目了然,毫无疑问。

然后从servlet开始,都是SpringMVC的配置,这里先后配置了类似全局Filter的类DispatcherServlet的路径,然后是SpringMVC的配置文件,我们将在那儿启用我们的全注解功能。servlet-mapping就真的像Filter一样,配置了需要拦截的请求路径,最后是一些字符集配置,在领略到成就感之前不叙述了,免得打击士气。

和刚才配置的信息一致的,我们在src下建立applicationContext.xml(这名字好长!虽然可以换掉它,但我在项目里一看见这名字就知道它是干什么的了,所以不换了)和servlet-mvc.xml。

首先配置applicationContext:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL" />
<property name="username" value="fm" />
<property name="password" value="admin" />
</bean> <!-- 配置Hibernate -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" >
<list>
<value></value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean> <context:annotation-config />
<context:component-scan base-package="com.eap.filemanager.service" />
<context:component-scan base-package="com.eap.pub.user.service.impl" />
<context:component-scan base-package="com.eap.pub.user.dao" />
</beans>

全部的内容,各位直接复制呗。这里xml头包括了注解的路径,然后配置DataSource,配置Hibernate,最后一段就是启用注解了,说是<context:annotation-config />在这个版本已经不需要写了,反正我项目现在正在跑着,先复制上来再说。最后路径扫描,我是定义到包的,因为通配符好像没起作用,老是报错,我就把所有需要扫描的包都写上去了。

接下来是SpringMVC,配置SpringMVC之前,其实各位已经可以开始和数据库进行交互操作了,可以编写DAO的代码了,我再说一遍,DAO是Data Access Object,这一层该写什么不该写什么,这名字清清楚楚了已经!

servlet-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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"
xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- ViewResolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 使用默认的注解映射 -->
<mvc:annotation-driven /> <!-- 自动扫描controller包中的控制器 -->
<context:component-scan base-package="com.eap.filemanager.cmd" /> </beans>

xml头,ViewResolver,然后启用注解,然后扫描。

这其中,第二部分的意思就是,SpringMVC里有个跳转类型叫做ModelAndView,它setView之后,就会自动跑到view名字+后缀的文件上去,比如setView("index"),那么在这个配置文件下,就会自动跳转到index.jsp上,而且是WEB-INF/jsp下的index.jsp上,WEB-INF下的jsp无法直接通过地址栏访问,所以这种控制可以让容器对资源访问权限进行管理。

大功告成,最困难的配置文件就这么搞定了,我可是花了好多时间在网上搜了来着,现在你们已经拥有了基石般的配置文件信息,你可以在上面测试通配符啦等你觉得方便的任何内容。

好了,看配置文件上的包也能知道,我的DAO是这么写的。

非常奇怪,使用@Controller和@Resource必须得实现接口,得这么写:

接口:

public interface IUserDao {
public List query(String sql);
public List queryByName(String name);
}

DAO代码:

@Repository
public class UserDao implements IUserDao{ Session session; @Autowired
UserDao(SessionFactory sessionFactory){
session = sessionFactory.getCurrentSession();
session.beginTransaction();
} public List query(String sql) {
SQLQuery query = session.createSQLQuery(sql).addEntity(User.class);
return query.list();
} public List queryByName(String username){
String sql = "select * from pub_user where username=?";
SQLQuery query = session.createSQLQuery(sql).addEntity(User.class);
query.setString(0, username);
return query.list();
}
}

这里我可是试了好多种方法,由于我喜欢直接写sql语句,以充分利用关系数据库的“关系”特性(毕竟关系型数据库不是和对象无缝贴合的,要发挥其最大优势应该从数据表之间的关系入手。有异议就提,最好论据充分,我需要证据不是结论,有了证据我也可以自己分析分析了,说不定我还知道点别的,能得出更有用的结论),所以我在这里使用了SQLQuery,否则你可以直接session.createQuery(hql)。但是,这里有一个问题,我继承HibernateDAOSupport反而会获取不到session或别的什么东西。

我在这儿顺便附上JavaBean的,完全注解。

@Entity
@Table(name="pub_user")
public class User {
@Id
@Column(name = "id", unique = true, nullable = false)
String id;
@Column(name="username")
String username;
@Column(name="passwd")
String passwd;
@Column(name="user_ip")
String userIp; //getter和setter...自己用Eclipse生成吧,我省略掉了
}

DAO这样写,那么我的Service就可以这么写了。一样的先接口,再@Controller

public interface UserService {
public List getUsers();
}
@Service
public class UserServiceImpl implements UserService{
@Resource
IUserDao dao; public List getUsers(){
List list = dao.query("select * from pub_user");
return list;
}
}

你看哦,我这里@Resource,必须写在接口定义的变量上面,然后Spring会自己去找谁实现了它并且还是@Resource的。关于具体命名管理,还有一些内容就不说了,这个在我们这么点代码的例子中根本就遇不到的。记得我说的,万一有两个DAO都实现了这个接口,那该怎么办呢,这就是命名管理要做的事情,自己去看吧(说不定你还没看完这篇博客就放弃Spring了,那么写上去真是多此一举……什么?你不会放弃?你不会放弃我也不写啊,我又没用到)。

接下来就是@Controller了,这里不需要接口了,嘿嘿(我就说,UserDao都是UserDao<T>,里面的save方法都不用定义具体类型了,干嘛每个模块还要用不同的DAO?既然大家都用一个DAO,干嘛还要依赖接口编程?我直接泛型<T>继承了一个HibernateDAO后,Spring还不许我这么访问DAO。不用拿概念忽悠我,我知道内聚和耦合在什么样的规模下会展现出自身特性的怎样的优缺点,但注解依赖接口编程的强制性让我搭建环境的过程中走了很多弯路。好吧,也有可能明明有办法不用建接口,只是我不知道罢了)。

@Controller
public class FileManagerControl{
@Autowired
UserService service;//其实我这不是User的Controller,反正Controller过程都一样,大家看看调用过程就行了哦 @RequestMapping({"/"})
public ModelAndView welcome(){
ModelAndView mv = new ModelAndView();
mv.addObject("users", service.getUsers());
mv.setViewName("index");
return mv;
}
}

这样,http://localhost:8080/[projectName]/,对应@RequestMapping({"/"})(如果里面是"/index.do"那么连接就是http://localhost:8080/[projectName]/index.do了)就能访问ModelAndView设置的index.jsp了。这时候jsp上,${users}将会调用User的toString()方法,很可惜,我试了${users.username},报错,不知道怎么搞。

最后呈上完整项目的同时,顺便也任性一把:http://download.csdn.net/detail/nietzsche0/9038115

这是CSDN下载,需要3个资源分。不是为了资源分,就是任性而已(之前传的,现在就是不想再传一份到网盘,就是不想把资源分下调)。我看登录CSDN下载项目比我搭建环境处理问题要容易得多了,也避免了像我一样,堆积了大量资料结果最后根本就不去做了。

Spring3+SpingMVC+Hibernate4全注解环境配置的更多相关文章

  1. Hibernate4之注解零配置

    @Entity ,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) . @Table ,注册在类头上,注解声明了该实体bean映射指定的表(table). @Id用来注册主属性, ...

  2. orcal 数据库 maven架构 ssh框架 的全注解环境模版 maven中央仓库批量删除lastupdated文件后依然是lastupdated解决方法 mirror aliyun中央仓库

    批量删除文件,得用批处理文件,文件名随便,路径改成你的Repository,代码如下 rem 这里写你的仓库路径 set REPOSITORY_PATH=d:\repo rem 正在搜索... for ...

  3. Spring MVC 4实现RESTFul WebServices的CRUD实例和使用RestTemplate进行请求(全注解形式配置Web和Filter)

    在这篇文章中,我们将使用Spring4 MVC编写一个CRUD RESTful Web服务,写一个REST客户端RestTemplate来使用这些服务.我们也将利用外部客户端测试的服务. 下面将展示核 ...

  4. struts2全注解Action配置

  5. 基于已构建S2SH项目配置全注解方式简化配置文件

    如果还不熟悉s2sh项目搭建的朋友可以先阅读 eclipse环境下基于tomcat-7.0.82构建struts2项目 eclipse环境下基于已构建struts2项目整合spring+hiberna ...

  6. 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录

    原文 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录 首先说说 IDEA 12,由于myeclipse越来越卡,我改用idea12 了,发现其功能强悍 ...

  7. 基于全注解的SpringMVC+Spring4.2+hibernate4.3框架搭建

    概述 从0到1教你搭建spring+springMVC+hibernate整合框架,基于注解. 本教程框架为基于全注解的SpringMVC+Spring4.2+hibernate4.3,开发工具为my ...

  8. 史上最全Windows版本搭建安装React Native环境配置

    史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...

  9. struts2+Hibernate4+spring3+EasyUI环境搭建之四:引入hibernate4以及spring3与hibernate4整合

    1.导入hibernate4 jar包:注意之前引入的struts2需要排除javassist  否则冲突 <!-- hibernate4 --> <dependency> & ...

随机推荐

  1. KVC该机制

    KVC该机制 KVC是cocoa的大招,用来间接获取或者改动对象属性的方式. 一.KVC的作用: KVC大招之中的一个: [self setValuesForKeysWithDictionary:di ...

  2. 正确Linux新手很实用20命令

     //正确Linux新手很实用20命令 //slwang  2014.4.19 1, ls list directory contents 内容 ls -l     //以详情模式(long li ...

  3. ngrok 本机代码部署外网访问神器(转)

    背景:听哥们说了个工具ngrok,可以让本机配置的web服务在外网访问,抱着将信将疑的态度试了试,发现还真的可以.下面记录下我自己的安装步骤,另外谈下自己还有些疑问的地方. 参考资料网站:http:/ ...

  4. UVA11100- The Trip, 2007

    option=com_onlinejudge&Itemid=8&category=512&page=show_problem&problem=2041"> ...

  5. [windows phone] 教你如何使地图动画缩放

    原文:[windows phone] 教你如何使地图动画缩放 说明 本篇将介绍如何将地图以动画显示呈现,在以下的范例介绍中可以看到有动画跟没动画的差别,如果你的地图还是很单调的话,不仿加上这个设计,让 ...

  6. 做web项目时对代码修改后浏览器端不生效的应对方法(持续更新)

    做web项目时,经常会遇到修改了代码,但浏览器端没有生效,原因是多种多样的,我会根据我遇到的情况逐步更新解决办法 1.运行的时候采用debug模式,一般情况下使用项目部署按钮右边那个按钮下的tomca ...

  7. 【shell文字】mysql每日备份shell文字

    每天固定时间使用mysqldump 备份mysql数据. #!/bin/bash #每天早上4点, mysql备份数据 orangleliu #chmod 700 backup.sh #crontab ...

  8. 图表引擎AChartEngine 二

    这几天项目涉及到android图表绘制,网上找的Demo都是大同小异,也就如上篇博文所写的一样是基本函数的实现.可是所有能找到的Demo都和设计图不符.木有办法,Leader发话啦,万不得已的情况下不 ...

  9. 未能加载文件或程序集“Common”或它的某一个依赖项。试图加载格式不正确的程序

    原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS——应用程序池——高级设置——启用32位应用程序 :true.解决方案二:修改 ...

  10. 开源Math.NET基础数学类库使用(02)矩阵向量计算

    原文:[原创]开源Math.NET基础数学类库使用(02)矩阵向量计算 开源Math.NET基础数学类库使用系列文章总目录:   1.开源.NET基础数学计算组件Math.NET(一)综合介绍    ...