posts - 297,  comments - 1618,  trackbacks - 0

基于注解的spring mvc hiberntae简单入门

/阿蜜果

日期/2012-11-28

基于注解的spring mvc hibernate简单入门 -凯发k8网页登录

本文旨在搭建spring mvc hibernate开发框架,通过一个简单的demo讲解spring mvc的相关配置文件,以及通过注解方式实现简单功能。

开发框架:spring spring mvc hibernatespring所用的版本为3.0.5)。

数据库:mysql(数据库名称testdemo工程所用的表名为user_info)。

2.1 创建工程

         eclipsejava ee版本或myeclipse中创建一个dynamic web project。并创建如下包:

1com.dao:系统的dao

2com.model:表的实体类(使用hibernate),在该工程中不配置.hbm.xml映射文件,采取注解的方式;

3com.service:业务逻辑接口类和实现类;

4com.webspring mvccontrollor类;

5com.configspringspring mvc的配置文件。

创建成功后包结构如下所示:
   springmvctest
        src 
        ----com
            ----amigo
                ----dao
                ----model
                ----service
                ----web
         ----config
         webcontent
         ----meta-inf
         ----web-inf
             ----lib
             ----classes

2.2 引入相关包

         需要将springspring mvchibernatemysql驱动、log4jc3p0数据源等的相关包引入。lib目录下的jar包如下:
      antlr-2.7.6.jar
      aopalliance.jar
      asm-attrs.jar
      asm.jar
      c3p0-0.9.0.jar
      cglib-2.1.3.jar
      commons-beanutils-1.8.0.jar
      commons-beanutils-bean-collections-1.8.0.jar
      commons-betwixt-0.8.jar
      commons-collections-2.1.1.jar
      commons-digester-2.1.jar
      commons-discovery-0.2.jar
      commons-httpclient.jar
      commons-logging.jar
      dom4j-1.6.1.jar
      ehcache-1.2.3.jar
      ejb3-persistence.jar
      hibernate-annotations.jar
      hibernate-commons-annotations.jar
      hibernate-entitymanager.jar
      hibernate-validator.jar
      hibernate3.jar
      jaas.jar
      javassist.jar
      jaxen-1.1-beta-7.jar
      jaxrpc.jar
      jboss-archive-browsing.jar
      jdbc2_0-stdext.jar
      jta.jar
      log4j-1.2.11.jar
      mysql-connector-java-5.0.4-bin.jar
      org.springframework.aop-3.0.5.release.jar
      org.springframework.asm-3.0.5.release.jar
      org.springframework.aspects-3.0.5.release.jar
      org.springframework.beans-3.0.5.release.jar
      org.springframework.context-3.0.5.release.jar
      org.springframework.context.support-3.0.5.release.jar
      org.springframework.core-3.0.5.release.jar
      org.springframework.expression-3.0.5.release.jar
      org.springframework.instrument-3.0.5.release.jar
      org.springframework.instrument.tomcat-3.0.5.release.jar
      org.springframework.jdbc-3.0.5.release.jar
      org.springframework.jms-3.0.5.release.jar
      org.springframework.orm-3.0.5.release.jar
      org.springframework.oxm-3.0.5.release.jar
      org.springframework.test-3.0.5.release.jar
      org.springframework.transaction-3.0.5.release.jar
      org.springframework.web-3.0.5.release.jar
      org.springframework.web.servlet-3.0.5.release.jar
      saaj.jar
      wsdl4j.jar
      xerces-2.6.2.jar
      xml-apis.jar

2.3 配置文件

2.3.1 配置web.xml

         web.xml中需要配置spring的配置文件(applicationcontext.xml)和spring mvc配置文件(spring-mvc.xml),配置指定所有.do的请求都由springdispatcherservlet类进行处理。

web.xml文件的参考配置如下:

xml version="1.0" encoding="utf-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="webapp_id" version="2.5">
 
<display-name>springmvctestdisplay-name>
 
<welcome-file-list>
    
<welcome-file>index.htmlwelcome-file>
    
<welcome-file>index.htmwelcome-file>
    
<welcome-file>index.jspwelcome-file>
 
welcome-file-list>
 
<context-param>
        
<param-name>contextconfiglocationparam-name>
        
<param-value>classpath:config/applicationcontext.xmlparam-value>
    
context-param>
    
<listener>
        
<listener-class>    org.springframework.web.context.contextloaderlistener
        
listener-class>
    
listener>
    
<servlet>
        
<servlet-name>spring-mvcservlet-name>
        
<servlet-class>org.springframework.web.servlet.dispatcherservletservlet-class>
        
<init-param>
            
<param-name>contextconfiglocationparam-name>
            
<param-value>classpath:config/spring-mvc.xmlparam-value>
        
init-param>
        
<load-on-startup>1load-on-startup>
    
servlet>
    
<servlet-mapping>
        
<servlet-name>spring-mvcservlet-name>
        
<url-pattern>*.dourl-pattern>
    
servlet-mapping>
    
<filter>
        
<filter-name>encodingfilterfilter-name>
        
<filter-class>org.springframework.web.filter.characterencodingfilterfilter-class>
        
<init-param>
            
<param-name>encodingparam-name>
            
<param-value>utf-8param-value>
        
init-param>
        
<init-param>
            
<param-name>forceencodingparam-name>
            
<param-value>trueparam-value>
        
init-param>
    
filter>
    
<filter-mapping>
        
<filter-name>encodingfilterfilter-name>
        
<url-pattern>/*
    

 

2.3.2 配置spring的配置文件

 

         spring的配置文件applicationcontext.xml文件中主要配置对hibernate的事务的管理,该配置文件的参考配置如下:

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"
xmlns:aop
="http://www.springframework.org/schema/aop"
xmlns:task
="http://www.springframework.org/schema/task"
    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
    http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/task   
http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 
    <context:annotation-config />

    

    
<context:component-scan base-package="com.amigo" >
    
<context:include-filter type="annotation" expression="org.springframework.stereotype.service" />
        
<context:include-filter type="annotation" expression="org.springframework.stereotype.repository" />
    
context:component-scan>

    
<bean id="datasource" class="com.mchange.v2.c3p0.combopooleddatasource" destroy-method="close">
        
<property name="driverclass">
           
<value>com.mysql.jdbc.drivervalue>
        
property>
        
<property name="jdbcurl">
<value>jdbc:mysql://localhost/test 
        property>
        
<property name="user">
            
<value>rootvalue>
        
property>
        
<property name="password">
            
<value>123456value>
        
property>
        
<property name="maxpoolsize">
            
<value>80value>
        
property>
        
<property name="minpoolsize">
            
<value>1value>
        
property>
        
<property name="initialpoolsize">
            
<value>1value>
        
property>
        
<property name="maxidletime">
            
<value>20value>
        
property>
    
bean>
    
<bean id="sessionfactory" class="org.springframework.orm.hibernate3.annotation.annotationsessionfactorybean">
        
<property name="datasource" ref="datasource"/>
        
<property name="packagestoscan" value="com.amigo.model*" >property>
        
<property name="hibernateproperties">
            
<props>
                
<prop key="hibernate.dialect">org.hibernate.dialect.mysqldialectprop>
                
<prop key="show_sql">trueprop>
                
<prop key="hibernate.jdbc.batch_size">20prop>
            
props>
        
property>
    
bean>

    

    
<bean id="transactionmanager" class="org.springframework.orm.hibernate3.hibernatetransactionmanager">
        
<property name="sessionfactory" ref="sessionfactory">property>
    
bean>
    
<bean id="transactioninterceptor"
class="org.springframework.transaction.interceptor.transactioninterceptor">
        
<property name="transactionmanager" ref="transactionmanager">property>
        
<property name="transactionattributes">
            
<props>
                
<prop key="save*">propagation_requiredprop>
                
<prop key="update*">propagation_requiredprop>
                
<prop key="delete*">propagation_requiredprop>
                
<prop key="find*">propagation_requiredprop>
                
<prop key="get*">propagation_requiredprop>
                
<prop key="execute*">propagation_requiredprop>
                
<prop key="load*">propagation_requiredprop>
                
<prop key="merge*">propagation_requiredprop>
                
<prop key="add*">propagation_requiredprop>
            
props>
        
property>
    
bean>
    
<bean
class="org.springframework.aop.framework.autoproxy.beannameautoproxycreator">
        
<property name="beannames">
            
<list>
                
<value>*servicevalue>
            
list>
        
property>
        
<property name="interceptornames">
            
<list>
         
<value>transactioninterceptorvalue>
            
list>
        
property>
    
bean> 
beans>



2.3.3 配置spring mvc配置文件

 

spring mvc的配置文件spring-mvc.xml中主要是controller的配置信息,该文件的参考配置如下:

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:mvc
="http://www.springframework.org/schema/mvc"
    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
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
   
    default-lazy-init
="true">
    
<context:annotation-config />
    

    
<context:component-scan base-package="com.amigo.web"/>

    
<bean id="viewresolver"      class="org.springframework.web.servlet.view.internalresourceviewresolver"
          p:prefix
="/web-inf"
          p:suffix
=".jsp" />
    
    
<bean class="org.springframework.web.servlet.mvc.annotation.defaultannotationhandlermapping" />
    

    
<bean     class="org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter">
        
<property name="messageconverters">
            
<list>
                
<bean class="org.springframework.http.converter.stringhttpmessageconverter"> 
                
bean>
            
list>
        
property>
    
bean>
beans>

 

2.4 创建数据库和表

创建test数据库和user_info表的sql语句如下(为了简便,user_info只有一个user_name字段):

create database test;
user test;
create table user_info (
 
user_name varchar(32not null,
 
primary key (user_name)
) engine
=innodb default charset=utf8;



3.1 dao

basehibernatedao类的代码如下所示:

package com.amigo.dao;

import javax.annotation.resource;

import org.hibernate.hibernateexception;
import org.hibernate.session;
import org.hibernate.sessionfactory;
import org.springframework.dao.dataaccessexception;
import org.springframework.dao.dataaccessresourcefailureexception;
import org.springframework.dao.support.daosupport;
import org.springframework.orm.hibernate3.hibernatetemplate;
import org.springframework.orm.hibernate3.sessionfactoryutils;

public class basehibernatedao extends daosupport{
    
private sessionfactory sessionfactory;
    
private hibernatetemplate hibernatetemplate;
    
public sessionfactory getsessionfactory() {
        
return sessionfactory;
    }


    @resource(name
="sessionfactory")
    
public void setsessionfactory(sessionfactory sessionfactory) {
        
this.sessionfactory = sessionfactory;
        
this.hibernatetemplate=createhibernatetemplate(sessionfactory);
    }


    
public session getsession() {
        
if (this.sessionfactory == null{
            
throw new hibernateexception("session create fail,sessionfactory is null!");
        }

        
return this.sessionfactory.getcurrentsession();
    }


    
protected hibernatetemplate createhibernatetemplate(
            sessionfactory sessionfactory) 
{
        
return new hibernatetemplate(sessionfactory);
    }


    @override
    
protected void checkdaoconfig() throws illegalargumentexception {
        
if (this.hibernatetemplate == null{
            
throw new illegalargumentexception("'sessionfactory' or 'hibernatetemplate' is required");
        }

    }

    
    
protected final session getsession(boolean allowcreate)
            
throws dataaccessresourcefailureexception, illegalstateexception {
        
return (!allowcreate ? sessionfactoryutils.getsession(
                getsessionfactory(), 
false) : sessionfactoryutils.getsession(
                getsessionfactory(),

     
this.hibernatetemplate.getentityinterceptor(),    this.hibernatetemplate.getjdbcexceptiontranslator()));
    }


    
protected final dataaccessexception converthibernateaccessexception(
            hibernateexception ex) 
{
        
return this.hibernatetemplate.converthibernateaccessexception(ex);
    }


    
protected final void releasesession(session session) {
        sessionfactoryutils.releasesession(session, getsessionfactory());
        
if(null!=session)session=null;
    }


    
public final void sethibernatetemplate(hibernatetemplate hibernatetemplate) {
        
this.hibernatetemplate = hibernatetemplate;
    }


    
public final hibernatetemplate gethibernatetemplate() {
        
return this.hibernatetemplate;
    }

}

user_info表的daouserinfodao类的代码如下所示:

package com.amigo.dao;
import org.springframework.stereotype.repository;

@repository
public class userinfodao extends basehibernatedao {
}

 

3.2 业务逻辑层

接口类ihelloservice的代码如下:

package com.amigo.service;
public interface ihelloservice {
    
public int adduser(string username) throws exception;;
}

实现类helloservice类的代码如下:

package com.amigo.service;
import javax.annotation.resource;

import org.apache.commons.logging.log;
import org.apache.commons.logging.logfactory;
import org.springframework.stereotype.repository;
import org.springframework.stereotype.service;

import com.amigo.dao.userinfodao;
import com.amigo.model.userinfo;

@service(
"helloservice")
@repository
public class helloservice implements ihelloservice {
    
private static final log log = logfactory.getlog(helloservice.class);
    
private userinfodao userdao;

    
public userinfodao getuserdao() {
        
return userdao;
    }


    @resource
    
public void setuserdao(userinfodao userdao) {
        
this.userdao = userdao;
    }


    @override
    
public int adduser(string username) throws exception {
        log.info(
"----------------adduser---------------");
        userinfo userinfo 
= new userinfo();
        userinfo.setusername(username);
        userdao.getsession().save(userinfo);
        
return 1;
    }

}



3.3 控制层

   控制类hellocontrollor类接收username参数,并调用相应的service类将用户名保存到user_info表中,该类的代码如下:

package com.amigo.web;

import javax.annotation.resource;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

import org.apache.commons.logging.log;
import org.apache.commons.logging.logfactory;
import org.springframework.stereotype.controller;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.responsebody;
import com.amigo.service.ihelloservice;

@controller
@requestmapping(
"/test")
public class hellocontrollor {
    
private static final log log = logfactory.getlog(hellocontrollor.class);

    
private ihelloservice helloservice;

    
public ihelloservice gethelloservice() {
        
return helloservice;
    }


    @resource
    
public void sethelloservice(ihelloservice helloservice) {
        
this.helloservice = helloservice;
    }


    @requestmapping(
"/hello.do")
    
public @responsebody 
        string sayhello(httpservletrequest request, httpservletresponse response) 
throws exception {
        request.setcharacterencoding(
"utf-8");
        string username 
= request.getparameter("username");
        log.info(
"username="  username);
        
int resultcode = helloservice.adduser(username);
        string rspinfo 
= "你好!"  username  ",操作结果码="  resultcode;
        response.setheader(
"content-type","text/html;charset=utf-8"); 
        response.getoutputstream().write(rspinfo.getbytes(
"utf-8"));
        
return "";
    }

}

@controller注解标识一个控制器,@requestmapping注解标记一个访问的路径;如果@requestmapping注解在类级别上,则表示一相对路径,在方法级别上,则标记访问路径;

测试时可以通过访问,通过username参数将用户名添加到user_info表中。

从实例代码可以看出,pojodao层、service层和controller层都是采用注解的方式将servicedao注入的,减少了配置量,方便了开发工作。

1)《》:

posted on 2012-11-28 11:07 阿蜜果 阅读(52460) 评论(12)     所属分类: java


feedback:
# re: 基于注解的spring mvc hiberntae简单入门
2012-11-30 08:35 |
ext.namespace('ext.ptc.part.commpartview') //定义包名

ext.ptc.part.commpartview.setconfigure = function(){ //定义类名称
this.checkboxgroup = new ext.form.checkboxgroup({
layout : 'column',
style : 'padding-left:15px;',
items : [{
xtype : 'compositefield',
items : [{
xtype :'checkbox',
id : 'collapsible',
name :'iscollapsible',
inputvalue : 'true',
boxlabel :'是否折叠'
}]
},{
xtype : 'compositefield',
items : [{
xtype :'checkbox',
id : 'enditem',
name :'isenditem',
inputvalue : 'true',
boxlabel :'是否顶层部件'
}]
}]

});

this.panel = new ext.form.formpanel({
width : 500,
height : 300,
border : false,
style :'padding: 10px 20px 2px 40px;',
border : false,
paramsashash : true,
id :'panelconfig',
baseparams : { oid : urloid },
api :{
load : parttoolscontroller.geitemconfiginfo,
submit : parttoolscontroller.saveitemconfiginfo
},
listeners : {
'render' : function() {
this.getform().load({
success : function(form, action) {
if(action.result.data.isdynamic == 'true'){
document.getelementbyid('dynamic').checked = true;
}

},

failure : function(form, action) {
alert('load is failure!')
}
});
}
},
items : [this.checkboxgroup ,{

buttons : [{
text :'保存',
border :false,
handler : function(){
ext.getcmp('panelconfig').getform().submit({
clientvalidation: false,
success: function(form, action) {
//表单提交成功则
var parturl = action.result.parturl;
var exception = action.result.exception;
//alert(parturl);
if(!ext.isempty(parturl)){
location.href = parturl;
}
}
});
}
}]
}
]
});


//定义构造函数
ext.ptc.part.commpartview.setconfigure.superclass.constructor.call(this,{

region : 'center',
renderto : ext.getbody(),
autoheight : true,
border : false,
items : [this.simple],
scope : this,
items :[this.panel],
listeners : {
'render' : function(){
}
}
});

};

ext.extend(ext.ptc.part.commpartview.setconfigure ,ext.panel,{ //定义继承的父类
//这里定义类的方法


});





//1、调用示例1
var maincontent = ext.getcmp('centercontent');
maincontent.removeall();
maincontent.add(new ext.ptc.part.commpartview.setconfigure());
maincontent.dolayout();

//2、调用示例2(完整js文件)
ext.ns('ext.ptc.viewmain');
ext.onready(function() {
this.northmenuitem = new ext.ptc.part.commpartview.setconfigure();
new ext.viewport({
xtype : 'panel',
layout : 'border',
autowidth : true,
border : true,
cls : 'wcshell',
id : "mainpage",
defaults : {
split : true
},
items : [this.northmenuitem]
});

});



//directstore
var madstore = new ext.data.directstore(
{
paramsashash : true,
baseparams : {
filejson : '',
replaceorleave : '',
parttemplate : ext.getcmp('id_usag_model').getvalue()
},
api : {
read : createusagelinkcontroller.getusagelinkfromfile
},
reader : new ext.data.jsonreader({
fields : [ 'removeflag', 'uploadpartnumber',
'uploadpartnumberhref', 'description', 'quantity',
'unit', 'linenumber', 'ismustneed', 'saleparttype',
'isplanningpart', 'status', 'version', 'occname',
'islabelpart', 'quoteprice', 'packingabc',
'template', 'hintkmsg', 'issyncok']
}),
listeners : {
scope : this,
load : function(p, records, options) {

}
}
});  回复  
  
# re: 基于注解的spring mvc hiberntae简单入门
2012-11-30 09:50 |
spring mvc 研究中  回复  
  
# re: 基于注解的spring mvc hiberntae简单入门
2012-11-30 15:35 |
filejson = ext.getcmp('old_usage').getjsonvalues();//上载文件
var usagbomitems = ext.getcmp('id_usag_bomitemspartjson').getstore().getjsonvalues();//可编辑表格
ext.getcmp('id_usag_bomitemspartjson').getstore().api.read = createusagelinkcontroller.getusagelinkfromfile;
ext.getcmp('id_usag_bomitemspartjson').getstore().load(
{
params : {
filejson : filejson,
usagbomitems : usagbomitems
},
add : false //是否在后面加,true时,在表格后面直接加入数据,false清空数据再加入
});



org.json.jsonarray jsonarray = new org.json.jsonarray(usagbomitems); //将表格数据转换为jsonarray
jsonobject json = (jsonobject) jsonarray.get(i);//可理解表格的一行数据
json.getstring("islabelpart")//获取列的值
  回复  
  
# re: 基于注解的spring mvc hiberntae简单入门
2012-11-30 16:38 |
客制化的jsp如果没有包含ootb的begin.jsp文件,需要在jsp中加入以下代码以保证session不会丢失:



如果已包含begin.jsp文件,则不能加入上述代码
同时需要注意:如果有引用其他jsp文件,则只需要在一个文件中加上述代码,不能重复添加。

说明:
2010年pdm升级出现了性能问题,查看jsp异常问题,发现jsp文件没有保存windchill context session,会给系统带来很大的性能压力,也可能是造成系统后台持续context错误的原因。
  回复  
  
# re: 基于注解的spring mvc hiberntae简单入门[未登录]
2012-11-30 17:32 |
//js中直接调用后台
partrelateddoccontroller.savepartdocref(partoid,docoid,
function(result, e){//回调函数
if ("success" == result) {
window.opener.ext.getcmp('adddocsrefencestoreid').getstore().reload();
window.close();
} else {
}

})
//后台方法
@extdirectmethod(group = "part")
public string savepartdocref(string partoid, string docoid)
throws wtruntimeexception, wtexception {
string message = "success";
//
//其它业务逻辑代码
//
return message;
}  回复  
  
# re: 基于注解的spring mvc hiberntae简单入门[未登录]
2012-11-30 17:59 |
//json字符串转换为后台bean
private static objectmapper mapper = new objectmapper();
uploadpartbean[] beans = mapper.readvalue(datejson,uploadpartbean[].class);
  回复  
  
# re: 基于注解的spring mvc hiberntae简单入门
2013-03-11 22:01 |
model层呢?  回复  
  
# re: 基于注解的spring mvc hibernate简单入门
2013-10-24 16:29 |
您好,能贴一下你这里面用到的jar包么  回复  
  
# re: 基于注解的spring mvc hibernate简单入门
2014-03-30 11:02 |
最代码网站上也分享了类似的代码,可以参考下:
整合spring mvc,mybatis,hibernate,freemarker框架实现的自定义注解validator验证机制实现对敏感词过滤的代码分享,地址:
  回复  
  
# re: 基于注解的spring mvc hibernate简单入门
2014-04-19 22:36 |
最代码转载地址:  回复  
  
# re: 基于注解的spring mvc hibernate简单入门
2015-10-10 11:37 |
@212 你个傻逼 贴一段代码干嘛!!!
  回复  
  
# re: 基于注解的spring mvc hibernate简单入门[未登录]
2016-03-26 23:41 |
kk
  回复  
  
2012年11月
28293031123
45678910
11121314151617
18192021222324
252729301
2345678

      生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
      我的作品:
        (2015年12月出版)
      

        (2015年7月出版)
      
        (2010年5月出版)
     

留言簿(261)

积分与排名

  • 积分 - 2268582
  • 排名 - 3

最新评论

阅读排行榜

评论排行榜

网站地图