Ajax+Struts2+Spring+Hibernate整合

原创 2007年09月26日 10:45:00

 我们沿用Spring+Hibernate+DWR的例子,做一个Ajax+Struts2.0+Spring+Hibernate整合,许多步骤大体相似,
我就直接搬过来了:
首先,建一个web project,然后添加对hibernate和spring的支持,我们使用的是hibernate3.2和spring2.0,然后导入xwork-2.0.3.jar struts2-core-2.0.8.jar struts2-spring-plugin-2.0.8.jar ognl-2.6.11.jar  freemarker-2.3.8.jar commons-logging-api-1.1.jar和commons-pool-1.3.jar(不知道myeclipse怎么搞的,添加Spring功能支持的时候就有了commons-dbcp.jar,居然没有其依赖的commons-pool-x.jar,只好单独添加了,另外,需要将Spring2.0 AOP Liberaries里的asm2.2.3.jar删除,因为好像和Hiberate中的生成代理用的asm.jar冲突,我把Spring2.0 AOP Liberaries排到最后仍然有冲突,所以只好删掉了,不知道大家遇到过这种情况么)。
我们使用myeclise自带的Derby数据库,在里面建一个表BOOK:
ID bigint primary key,autoincrement
NAME varchar(20)
ISBM varchar(20)
AUTHOR varchar(15)
然后利用myeclipse的hibernate反向工程生成领域模型:Book.java, DAO:BookDAO.jar, Book 的映射文件Book.hbm.xml:
生成的代码及配置文件如下:

Book.java:

package edu.jlu.fuliang.domain;

/**
 * Book generated by MyEclipse Persistence Tools
 
*/


public class Book implements java.io.Serializable {

    
// Fields

    
private long id;
    
private String name;
    
private String isbm;
    
private String author;

    
// Constructors

    
/** default constructor */
    
public Book() {
    }


    
/** minimal constructor */
    
public Book(String name, String isbm) {
        
this.name = name;
        
this.isbm = isbm;
    }


    
/** full constructor */
    
public Book(String name, String isbm, String author) {
        
this.name = name;
        
this.isbm = isbm;
        
this.author = author;
    }


    
// Property accessors

    
public long getId() {
        
return this.id;
    }


    
public void setId(long id){
        
this.id = id;
    }


    
public String getName() {
        
return this.name;
    }


    
public void setName(String name) {
        
this.name = name;
    }


    
public String getIsbm() {
        
return this.isbm;
    }


    
public void setIsbm(String isbm) {
        
this.isbm = isbm;
    }


    
public String getAuthor() {
        
return this.author;
    }


    
public void setAuthor(String author) {
        
this.author = author;
    }


}

BookDAO.java:

package edu.jlu.fuliang.dao;

import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import edu.jlu.fuliang.domain.Book;

/**
 * Data access object (DAO) for domain model class Book.
 * 
 * 
@see edu.jlu.fuliang.domain.Book
 * 
@author MyEclipse Persistence Tools
 
*/


public class BookDAO extends HibernateDaoSupport {
    
private static final Log log = LogFactory.getLog(BookDAO.class);
    
// property constants
    public static final String NAME = "name";
    
public static final String ISBM = "isbm";
    
public static final String AUTHOR = "author";

    
protected void initDao() {
        
// do nothing
    }


    
public void save(Book transientInstance) {
        log.debug(
"saving Book instance");
        
try {
            getHibernateTemplate().save(transientInstance);
            log.debug(
"save successful");
        }
 catch (RuntimeException re) {
            log.error(
"save failed", re);
            
throw re;
        }

    }


    
public void delete(Book persistentInstance) {
        log.debug(
"deleting Book instance");
        
try {
            getHibernateTemplate().delete(persistentInstance);
            log.debug(
"delete successful");
        }
 catch (RuntimeException re) {
            log.error(
"delete failed", re);
            
throw re;
        }

    }


    
public Book findById(Long id) {
        log.debug(
"getting Book instance with id: " + id);
        
try {
            Book instance 
= (Book) getHibernateTemplate().get(
                    
"edu.jlu.fuliang.domain.Book", id);
            
return instance;
        }
 catch (RuntimeException re) {
            log.error(
"get failed", re);
            
throw re;
        }

    }


    
public List findByExample(Book instance) {
        log.debug(
"finding Book instance by example");
        
try {
            List results 
= getHibernateTemplate().findByExample(instance);
            log.debug(
"find by example successful, result size: "
                    
+ results.size());
            
return results;
        }
 catch (RuntimeException re) {
            log.error(
"find by example failed", re);
            
throw re;
        }

    }


    
public List findByProperty(String propertyName, Object value) {
        log.debug(
"finding Book instance with property: " + propertyName
                
+ ", value: " + value);
        
try {
            String queryString 
= "from Book as model where model."
                    
+ propertyName + "= ?";
            
return getHibernateTemplate().find(queryString, value);
        }
 catch (RuntimeException re) {
            log.error(
"find by property name failed", re);
            
throw re;
        }

    }


    
public List findByName(Object name) {
        
return findByProperty(NAME, name);
    }


    
public List findByIsbm(Object isbm) {
        
return findByProperty(ISBM, isbm);
    }


    
public List findByAuthor(Object author) {
        
return findByProperty(AUTHOR, author);
    }


    
public List findAll(){
        log.debug(
"finding all Book instances");
        
try {
            String queryString 
= "from Book";
            
return getHibernateTemplate().find(queryString);
        }
 catch (RuntimeException re) {
            log.error(
"find all failed", re);
            
throw re;
        }

    }


    
public Book merge(Book detachedInstance) {
        log.debug(
"merging Book instance");
        
try {
            Book result 
= (Book) getHibernateTemplate().merge(detachedInstance);
            log.debug(
"merge successful");
            
return result;
        }
 catch (RuntimeException re) {
            log.error(
"merge failed", re);
            
throw re;
        }

    }


    
public void attachDirty(Book instance) {
        log.debug(
"attaching dirty Book instance");
        
try {
            getHibernateTemplate().saveOrUpdate(instance);
            log.debug(
"attach successful");
        }
 catch (RuntimeException re) {
            log.error(
"attach failed", re);
            
throw re;
        }

    }


    
public void attachClean(Book instance) {
        log.debug(
"attaching clean Book instance");
        
try {
            getHibernateTemplate().lock(instance, LockMode.NONE);
            log.debug(
"attach successful");
        }
 catch (RuntimeException re) {
            log.error(
"attach failed", re);
            
throw re;
        }

    }


    
public static BookDAO getFromApplicationContext(ApplicationContext ctx) {
        
return (BookDAO) ctx.getBean("BookDAO");
    }

}

Book.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    
<class name="edu.jlu.fuliang.domain.Book" table="BOOK" schema="CLASSICCARS">
        
<id name="id" type="long">
            
<column name="ID" />
            
<generator class="identity"></generator>
        
</id>
        
<property name="name" type="string">
            
<column name="NAME" length="20" not-null="true" />
        
</property>
        
<property name="isbm" type="string">
            
<column name="ISBM" length="20" not-null="true" unique="true" />
        
</property>
        
<property name="author" type="string">
            
<column name="AUTHOR" length="15" />
        
</property>
    
</class>
</hibernate-mapping>

下面我们配置一下Spring,我们把applicationContext.xml分成了三个,分别是applicationContext-db.xml,applicationContext-dao.xml,applicationContext-service.我们看看如何配置:

applicationContext-db.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"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    
<bean id="dataSource"
        class
="org.apache.commons.dbcp.BasicDataSource">
        
<property name="driverClassName"
            value
="org.apache.derby.jdbc.ClientDriver">
        
</property>
        
<property name="url"
            value
="jdbc:derby://localhost:1527/myeclipse;create=true">
        
</property>
        
<property name="username" value="classiccars"></property>
        
<property name="password" value="myeclipse"></property>
    
</bean>
    
    
<bean id="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        
<property name="dataSource">
            
<ref bean="dataSource" />
        
</property>
        
<property name="hibernateProperties">
            
<props>
                
<prop key="hibernate.dialect">
                    org.hibernate.dialect.DerbyDialect
                
</prop>
            
</props>
        
</property>
        
<property name="mappingResources">
            
<list>
                
<value>edu/jlu/fuliang/domain/Book.hbm.xml</value></list>
        
</property>
    
</bean>
</beans>

applicationContext-dao.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"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    
    
<bean id="bookDAO" class="edu.jlu.fuliang.dao.BookDAO">
        
<property name="sessionFactory">
            
<ref bean="sessionFactory" />
        
</property>
    
</bean>

</beans>

接下来我们来写我们的Service层:

BookManageService.java:

package edu.jlu.fuliang.service;
import java.util.List;

import edu.jlu.fuliang.domain.Book;

public interface BookManageService {
    
public List<Book> getAllBooks();
    
public List<Book> getBookByName(String name);
    
public void updateBook(Book book);
    
public void addBook(Book book);
    
public void deleteBook(long id);
    
public Book getBookById(Long id);
}

BookManageServiceImpl.java:

package edu.jlu.fuliang.serviceImpl;

import java.util.List;

import edu.jlu.fuliang.dao.BookDAO;
import edu.jlu.fuliang.domain.Book;
import edu.jlu.fuliang.service.BookManageService;

public class BookManageServiceImpl implements BookManageService{
    
private BookDAO bookDAO;
    @Override
    
public void addBook(Book book) {
        bookDAO.save(book);
    }


    @Override
    
public void deleteBook(long id) {
        Book book 
= bookDAO.findById(id);
        bookDAO.delete(book);        
    }


    @Override
    
public List<Book> getAllBooks() {
        
return bookDAO.findAll();
    }


    @Override
    
public List<Book> getBookByName(String name) {
        
return bookDAO.findByName(name);
    }


    @Override
    
public void updateBook(Book book) {
        bookDAO.attachDirty(book);
    }

    
    
public void setBookDAO(BookDAO bookDAO){
        
this.bookDAO = bookDAO;
    }


    @Override
    
public Book getBookById(Long id) {
        
return bookDAO.findById(id);
    }

}


然后写一个struts的Action,他完全是一个POJO:

package edu.jlu.fuliang.action;

import java.util.List;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.Preparable;

import edu.jlu.fuliang.domain.Book;
import edu.jlu.fuliang.service.BookManageService;

public class BookAction implements Preparable{
    
private BookManageService bookManageService;
    
private List<Book> books;
    
private Book book;
    
private Long id;
    
    
public String execute(){
        
this.books = bookManageService.getAllBooks();
        
return Action.SUCCESS;
    }

    
    
public String save(){
        
this.bookManageService.addBook(book);
        
return execute();
    }

    
    
public void prepare()throws Exception{
        
if(id != null)
            book 
= bookManageService.getBookById(id);
    }

    
    
public String remove(){
        bookManageService.deleteBook(id);
        
return execute();
    }

    
    
public List<Book> getBooks() {
        
return books;
    }

    
    
public void setBooks(List<Book> books) {
        
this.books = books;
    }

    
public Book getBook() {
        
return book;
    }

    
public void setBook(Book book) {
        
this.book = book;
    }

    
public Long getId() {
        
return id;
    }

    
public void setId(Long id) {
        
this.id = id;
    }

    
public void setBookManageService(BookManageService bookManageService) {
        
this.bookManageService = bookManageService;
    }

}

然后我们来配置Service、事务以及struts的action:

 applicationContext-service.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"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    
<bean id="bookManageServiceTarget" class="edu.jlu.fuliang.serviceImpl.BookManageServiceImpl">
        
<property name="bookDAO">
            
<ref bean="bookDAO"/>
        
</property>
    
</bean>
    
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        
<property name="sessionFactory">
            
<ref bean="sessionFactory"/>
        
</property>
    
</bean>
    
<bean id="bookManageService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        
<property name="transactionManager">
            
<ref bean="transactionManager"/>
        
</property>
        
<property name="target">
            
<ref bean="bookManageServiceTarget"/>
        
</property>
        
<property name="transactionAttributes">
            
<props>
                
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                
<prop key="*">PROPAGATION_REQUIRED</prop>
            
</props>
        
</property>
    
</bean>
    /* configure struts action as bean in spring*/
    
<bean id="bookAction" scope="prototype" class="edu.jlu.fuliang.action.BookAction">
        
<property name="bookManageService">
            
<ref bean="bookManageService"/>
        
</property>
    
</bean>
    
</beans>

配置struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>

<struts>
    
<constant name="struts.objectFactory" value="spring"/>
    
<constant name="struts.devMode" value="true"/>
    
    
<package name="book" extends="struts-default">
        
<action name="list" method="execute" class="bookAction">
            
<result>list.jsp</result>
            
<result name="input">list.jsp</result>
        
</action>
        
<action name="remove" method="remove" class="bookAction">
            
<result>list.jsp</result>
            
<result name="input">list.jsp</result>
        
</action>
        
<action name="save" method="save" class="bookAction">
            
<result>list.jsp</result>
            
<result name="input">list.jsp</result>
        
</action>
    
</package>
</struts>

配置WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns
="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
 
<filter>
     
<filter-name>struts</filter-name>
     
<filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
     
</filter-class>
 
</filter>
 
<filter-mapping>
     
<filter-name>struts</filter-name>
     
<url-pattern>/*</url-pattern>
 
</filter-mapping>
 
 
<welcome-file-list>
      
<welcome-file>index.jsp</welcome-file>
 
</welcome-file-list>
 
 
<context-param>
     
<param-name>contextConfigLocation</param-name>
     
<param-value>classpath:applicationContext-*.xml</param-value>
 
</context-param>
 
 
<listener>
     
<listener-class>
         org.springframework.web.context.ContextLoaderListener
     
</listener-class>
 
</listener>
</web-app>

配置一下log:

# This is the configuring for logging displayed in the Application Server
# log4j.rootCategory
=INFO, stdout,logfile
log4j.rootCategory
=DEBUG, A1

#console configure
log4j.appender.A1 
= org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout 
= org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern 
= %-4r [%t] %-5p %c %x - %m%n

#stdout configure
log4j.appender.stdout
=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
= %d %p [%c] - <%m>%n

#logfile configure
log4j.appender.logfile
=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File
=log4j.log
log4j.appender.logfile.layout
=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern
= %d %p [%c] - <%m>%n

# Control logging for other open source packages
# Changing the log level to DEBUG when debug
log4j.logger.org.springframework
=ERROR
log4j.logger.org.springframework.web.context.support.XmlWebApplicationContext
=INFO
log4j.logger.org.hibernate
=ERROR
log4j.logger.org.hibernate.cfg.HbmBinder
=INFO
log4j.logger.org.hibernate.SQL
=ERROR
log4j.logger.org.hibernate.cache
=ERROR
log4j.logger.org.hibernate.transaction
=INFO
log4j.logger.net.sf.ehcache
=ERROR
log4j.logger.org.apache.struts
=ERROR
log4j.logger.com.htxx.service.dao
=INFO
log4j.logger.org.apache.commons
=INFO
log4j.logger.org.directwebremoting
=INFO

写两个页面index.jsp,list.jsp,使用了Ajax--dojo::

index.jsp:

<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
    
<head>
        
<s:head theme="ajax" debug="true"/>
        
<script type="text/javascript">
            dojo.event.topic.subscribe(
"/save"function(data, type, request) {
                
if(type == "load"{
                    dojo.byId(
"id").value = "";
                    dojo.byId(
"name").value = "";
                    dojo.byId(
"isbm").value = "";
                    dojo.byId(
"author").value = "";
                }

            }
);

            dojo.event.topic.subscribe(
"/edit"function(data, type, request) {
                
if(type == "before"{
                    
var id = data.split("_")[1];
                    
var tr = dojo.byId("row_"+id);
                    
var tds = tr.getElementsByTagName("td");

                    dojo.byId(
"id").value = id;
                    dojo.byId(
"name").value = dojo.string.trim(dojo.dom.textContent(tds[0]));
                    dojo.byId(
"isbm").value = dojo.string.trim(dojo.dom.textContent(tds[1]));
                    dojo.byId(
"author").value = dojo.string.trim(dojo.dom.textContent(tds[1]));
                }

            }
);
        
</script>
    
</head>
    
<body>
        
<s:url action="list" id="descrsUrl"/>

        
<div style="width: 300px;border-style: solid">
            
<div style="text-align: right;">
                
<s:a theme="ajax" notifyTopics="/refresh">Refresh</s:a>
            
</div>
            
<s:div id="books" theme="ajax" href="%{descrsUrl}" loadingText="Loading..." listenTopics="/refresh"/>
        
</div>

        
<br/>

        
<div style="width: 300px;border-style: solid">
            
<p>Book Data</p>
            
<s:form action="save" validate="true">
                
<s:textfield id="id" name="person.id" cssStyle="display:none"/>
                
<s:textfield id="name" label="Name" name="book.name"/>
                
<s:textfield id="isbm" label="ISBN" name="book.isbm"/>
                
<s:textfield id="author" label="Author" name="book.author"/>
                
<s:submit theme="ajax" targets="books" notifyTopics="/save"/>
            
</s:form>
        
</div>
    
</body>
</html>

list.jsp:

<%@ taglib prefix="s" uri="/struts-tags"%>
<p>Books</p>
<s:if test="books.size > 0">
 
<table>
  
<s:iterator value="books">
   
<tr id="row_<s:property value="id"/>">
    
<td>
     
<s:property value="name" />
    
</td>
    
<td>
     
<s:property value="isbm" />
    
</td>
    
<td>
     
<s:property value="author"/>
    
</td>
    
<td>
     
<s:url id="removeUrl" action="remove">
      
<s:param name="id" value="id" />
     
</s:url>
     
<s:a href="%{removeUrl}" theme="ajax" targets="books">Remove</s:a>
     
<s:a id="a_%{id}" theme="ajax" notifyTopics="/edit">Edit</s:a>
    
</td>
   
</tr>
  
</s:iterator>
 
</table>
</s:if>


在浏览器中输入地址,我们就可以在一个页面进行CRUD操作了.

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

这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样。    ...
  • liujiahan629629
  • liujiahan629629
  • 2014年03月19日 22:57
  • 35848

使用ucenter整合网站和discuz的同步登陆

首先先说下我做这个的原因。 因为现有项目的需求,需要添加一个论坛。然后把原有网站的用户数据和论坛的数据同步起来,使得用户数据能共用和同步登陆等。。 首先 http://www.comsenz.co...
  • qq_30752937
  • qq_30752937
  • 2016年04月09日 09:26
  • 3326

Spring+Struts2+mybatis三大框架的整合配置

现在主流的项目框架中,数据库持久层有可能不是hibernate,而是mybatis或者ibatis,其实它们都是一样的,下面我来把环境搭建一下: 【导入相关jar包】新建web项目工程mss,Spri...
  • lgslgs123456
  • lgslgs123456
  • 2015年08月01日 10:23
  • 2421

现代银行集中式业务系统及数据整合

随着互联网和移动互联网的普及,互联网金融也日益进入人们的日常生活。当前互联网金融方兴未艾,各种新颖高效的金融产品层出不穷。随之而来的是日益激烈的竞争。在这次金融革新的大潮中,传统银行暂时处于相对保守的...
  • sdmxdzb
  • sdmxdzb
  • 2016年06月15日 09:24
  • 652

struts2+Hibernate+spring基础整合相关介绍

很多时候,对于初学者来说,对于整合的时候很难下手,同时呢,初学者对一些src下包的含义也一头雾水,不知道这些包都是什么含义~~~在这里一步一步的教大家如何整合。 首先,在这里给大家讲解一下src包的定...
  • zeq9069
  • zeq9069
  • 2013年09月23日 10:10
  • 1377

数据切分及整合方案

通过前面的章节,我们已经很清楚了通过数据库的数据切分可以极大的提高系统的扩展性。但是,数据库中的数据在经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何来让这些数据源...
  • wkwanglei
  • wkwanglei
  • 2015年11月09日 15:19
  • 1582

最新iwebshop与ucenter整合成功方法及bug处理

最新iwebshop与ucenter整合成功方法及bug处理,解决了提示discuzx3.2“通信失败”的问题,是真正的双向同步整合。...
  • CiuPasswort
  • CiuPasswort
  • 2015年10月11日 00:32
  • 1375

openfire整合现有系统用户

以下内容是从别人的博客里复制过来的,原文地址:http://blog.csdn.net/unicorn_520/article/details/7700018。 我在这里需要特别强调的是connec...
  • majian_1987
  • majian_1987
  • 2013年07月29日 13:02
  • 7436

手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

小疯手把手带你整合SpringMVC+Spring+MyBatis三大框架,俗称SSM,用它完全代替传统的SSH框架,把它们最优雅的一面发挥出来。整合配置结束后,会有一个应用实例“图书管理系统”带给大...
  • qq598535550
  • qq598535550
  • 2016年06月19日 01:57
  • 75663

如何使自己的网站与UC进行用户整合

UCenter整合 详细教程康盛的Ucenter产品非常的强大。即便不使用也有很好的学习价值。在这里我们只说,如何将自己的网站和其他康盛的站点互通,当然是使用ucenter为了,让两个应用之间可以互通...
  • w_yunlong
  • w_yunlong
  • 2015年12月29日 11:56
  • 3169
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ajax+Struts2+Spring+Hibernate整合
举报原因:
原因补充:

(最多只允许输入30个字)