Struts2 + Spring 3 + Hibernate 4 + Java 使用经验总结

来源:互联网 发布:手机时间网络时间不对 编辑:程序博客网 时间:2024/06/06 05:07

一、Strus2

      1、配置文件Struts.xml

       <package name="default" extends="struts-default" namespace="/">
<default-action-ref name="index"></default-action-ref>
<action name="indexAction" class="cn.bupt.mes.action.IndexAction">
<result>/index.jsp</result>
</action>
</package>


<package name="json" extends="json-default" namespace="/json">
<action name="enroll" class="cn.bupt.mes.action.GeneralEnrollAction">
<result type="json">
<param name="root">responseJson</param>
</result>
</action>
</package>

系统有默认命名空间(没有namespace这一属性)、根命名空间namespace="/"、和自定义命名空间namespace=“/json”

加入请求的url为“/jsp/indexAction” 则系统会先在/jsp命名空间下查找,找不到的话会在默认命名空间查找,

 照上面的配置,果断出错。解决方案是删除default包的命名空间;

但是假如请求url为“/indexAction”的话,系统会先在根命名空间查找名为indexAction的Action,如上配置就能找到;


    2、把对前台页面响应的参数通过Struts2转换为Json格式

       Struts.xml配置为如上json包的配置,在前台页面配置action名的时候为如下格式:json/action名!方法名,例如  json/enroll!getMzAndTotal    

      GeneralEnrollAction代码如下:

        public class GeneralEnrollAction extends ActionSupport {

private static final long serialVersionUID = 5634268379958777569L;

private NlqService nlqService;

public Map<String, Object> responseJson;

public NlqService getNlqService() {
return nlqService;
}
public void setNlqService(NlqService nlqService) {
this.nlqService = nlqService;
}
public Map<String, Object> getResponseJson() {
return responseJson;
}
public void setResponseJson(Map<String, Object> responseJson) {
this.responseJson = responseJson;
}

@SuppressWarnings("unchecked")
public String getMzAndTotal(){
Map<String, Object> map = new HashMap<String, Object>();
List<Map<String, Object>> list = (List<Map<String, Object>>) nlqService.findMZAndTotalGroupByMZM();
map.put("rows", list);
this.setResponseJson(map);
return SUCCESS;
}

}

如上代码,能够把List<Map>封装入一个Map中,然后通过在Struts.xml中的配置,

Struts能够把最终封装好的Map转为Json格式传到前台页面展示;


二、Spring

     1、配置数据源

       一句话,配置不同的数据源的时候<property name=“”/>要做相应更改 例如:

     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
 <property name="driverClass" value="com.mysql.jdbc.Driver"/>
 <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mesys"/>
 <property name="user" value="root"/>
 <property name="password" value="123456"/>
</bean>

        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
             <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
          <value>jdbc:mysql://localhost/healthmanage?useUnicode=true&amp;characterEncoding=UTF-8</value> 
        </property>
        <property name="username">
             <value>root</value>
        </property>
        <property name="password">
             <value>123456</value>
        </property>
    </bean>


     2、配置sessionFactory和transactionManager的时候Hibernate版本问题

        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"  

                    p:sessionFactory-ref="sessionFactory"/>

      我的hibernate版本为4.1相应的上面配置的数字为4,有人hibernate是4以上,

      配置成org.springframework.orm.hibernate3.LocalSessionFactoryBean,

      这个果断出错;

   

    3、现在的Spring版本不用在applicationContext.xml里面配置action,action使用的service注入问题,

         现在有spring管理,你只要在action里面声明,并生成get/set方法即可


     4、别忘了在web.xml里面配置applicationContext.xml的位置,否则读不出配置文件,假如applicationContext.xml在根目录下,配置为

        <context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:applicationContext.xml</param-value>
</context-param> 


三、Hibernate

     只有一点,也是最坑爹的一点,Hibernate4.1 自动生成映射文件的时候 是错误的映射文件,需要改动的地方是:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd ">   

      hibernate-mapping-3.0.dtd后面有一个空格,需要删除才正确,否侧会爆出不能读取映射文件XML的错误。

        而且你真找不到原因。你以为那是自动生成的肯定对的!


四、Java

     java学得不好啊。。。内疚

     hibernate查询结果为一个list,list里面的对象想要取出来用,假如对象为3列数据

                 //遍历list

      for(Iterator<?> pit = mzList.iterator() ; pit.hasNext();){

                        // 把list里面的对象转为Object[]
Object[] objs = (Object[]) pit.next();
                        System.out.println(objs[0].toString());

                         System.out.println(objs[1].toString());

                         System.out.println(objs[2].toString());

}

      当然  假如你的查询结果仅为 被查询表的几行数据,查询结果的结构和表一模一样,你就可以使用表的实体类,

         强制转换list里的对象为表的实体类对象,直接使用对象里面的内容。

        表TableA   对应实体类TableA    表的属性有   Name  Sex   Age

         List<TableA>  list = (List<TableA>)  dao.findById();

        for(int i = 0 ; i < list.size() ; i ++){

             System.out.println(list.get(i).getName());

             System.out.println(list.get(i).getSex());

             System.out.println(list.get(i).getAge());

         }





原创粉丝点击