`
wanglu271991027
  • 浏览: 90631 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

struts2+ibatis+spring 安例

 
阅读更多
1.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:aop="http://www.springframework.org/schema/aop"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <!-- 启用注解 -->
    <context:annotation-config />
    <context:component-scan base-package="com.*" />
    <!-- 自动AOP切面 -->
    <aop:aspectj-autoproxy />

	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/>
		<property name="url" value="proxool.mydata"/>
	</bean>
	<!-- 配置事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
	</bean>
	<!-- AOP 
	<bean id="personimport" class="com.sdjt.service.base.PersonImport"></bean>  
    <aop:config>  
        <aop:pointcut expression="execution(public * com.sdjt.service.customer.LPersonService.add*(..))||execution(public * com.sdjt.service.customer.LPersonService.delete*(..))||execution(public * com.sdjt.service.customer.LPersonService.edit*(..))" id="servicePointCut"/>  
        <aop:aspect id="importAspect" ref="personimport">  
            <aop:after method="afterReturning" pointcut-ref="servicePointCut"/>  
        </aop:aspect>  
    </aop:config>  
    -->
	
	<!-- 事务注解 proxy-target-class="true" -->
	<tx:annotation-driven transaction-manager="transactionManager"/> 
	
	<!-- SqlMap setup for iBATIS Database Layer -->
	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>
	 <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
        <property name="sqlMapClient" ref="sqlMapClient" />
    </bean>
	<bean id="springContext" class="com.sdjt.util.SpringDAOUtil"></bean>
	
	<bean id="roleMenuUtil" class="com.sdjt.util.RoleMenuUtil">
		<property name="roleServiceImp" ref="roleServiceImpl"></property>
		<property name="userServiceImp" ref="userServiceImpl"></property>
	</bean>
	<!-- 模板管理 -->
	<!-- import resource="spring_template.xml"-->
	<!--import resource="classpath:com/springxml/member_bean.xml"-->
</beans>

2.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
	version="2.4">
	<display-name>icrm</display-name>
	<context-param>
		<description>!logpath !log4j.properties</description>
		<param-name>webAppRootKey</param-name>
		<param-value>icrm.root</param-value>
	</context-param>
		 <!-- 加载输出界面的表格 -->
	<context-param>
		<param-name>jmesaPreferencesLocation</param-name>
		<param-value>WEB-INF/jmesa/jmesa.properties</param-value>
	</context-param>
		
	<context-param>
		<param-name>jmesaMessagesLocation</param-name>
		<param-value>org/jmesa/core/message/resource/jmesaResourceBundle</param-value>
	</context-param>
	<!-- 字符编码格式 -->
	<filter>  
     <filter-name>CharacterEncodingFilter</filter-name>  
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
 	<init-param>  
	     <param-name>encoding</param-name>  
	    <param-value>utf-8</param-value>  
	  </init-param>  
	 <init-param>  
	   <param-name>forceEncoding</param-name>  
	   <param-value>true</param-value>  
	 </init-param>  
	</filter>  
	  <filter-mapping>  
     <filter-name>CharacterEncodingFilter</filter-name>  
	 <url-pattern>/*</url-pattern>  
	</filter-mapping>  
	
	<!-- 配置登录filter -->
	<filter>
		<filter-name>loginFilter</filter-name>
		<filter-class>com.sdjt.security.LoginFilter</filter-class>
		<init-param>
			<param-name>passUrl</param-name>
			<param-value>/ckeditor,/css,/images,/img,/jmesaimages,/js,/login.jsp,/login.jsp,/userManager,/desktopManager,/Charts,/struts-tags,/wapsystem
			</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>loginFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 文件上传的清理过滤器 -->
	<filter>
		<filter-name>struts-cleanup</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.ActionContextCleanUp
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts-cleanup</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 配置struts  -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!--  加载spring配置文件-->        
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext/applicationContext.xml</param-value>
	</context-param>
 <!-- 配置spring下的log4j -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/classes/log4j.properties</param-value>
	</context-param>


	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    
    <listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener> 
	<listener>
		<listener-class>com.sdjt.security.ListenerReq</listener-class>
	</listener>
	<listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>
	<!-- 
	<filter>
		<filter-name>filter_sms</filter-name>
		<filter-class>jtml.request.Filter_sms</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>filter_sms</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	 -->
	<!-- 配置proxool数据源 -->
	<servlet>
		<servlet-name>ServletConfigurator</servlet-name>
		<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
		<init-param>
			<param-name>xmlFile</param-name>
			<param-value>WEB-INF/proxool.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet>
		<servlet-name>InitContextServlet</servlet-name>
		<servlet-class>com.sdjt.security.InitContextServlet</servlet-class>
		<load-on-startup>5</load-on-startup>
	</servlet>
	<servlet>
		<servlet-name>proxool</servlet-name>
		<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>proxool</servlet-name>
		<url-pattern>/proxool</url-pattern>
	</servlet-mapping>
	
	<!-- 
	<servlet>
		<servlet-name>context</servlet-name>
		<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>
	 -->
	<welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	</welcome-file-list>
</web-app>

3.数据库配制文件
<?xml version="1.0" encoding="UTF-8"?>
<proxool>

	<alias>mydata</alias>
	<driver-url>jdbc:mysql://localhost:3306/smsdemotest?zeroDateTimeBehavior=convertToNull</driver-url>
	<driver-class>org.gjt.mm.mysql.Driver</driver-class>
	<statistics>1m,15m,1d</statistics>
	<driver-properties>
		<property name="user" value="root"/>
		<property name="password" value="admin"/>
	</driver-properties>  
	<prototype-count>5</prototype-count>
	<maximum-connection-count>20</maximum-connection-count>
	<minimum-connection-count>5</minimum-connection-count>
	<maximum-active-time>600000</maximum-active-time>
	<house-keeping-sleep-time>90000</house-keeping-sleep-time>
	<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
	
</proxool>


4.dao
package com.sdjt.dao.base;

import java.util.List;

import com.sdjt.util.page.PageData;
import com.sdjt.wap.base.WapPage;


/**
 * 业务实体操作接口
 * 
 * @author oliver
 * @date 2010.10.26
 * @email wangxiaojun0618@163.com
 * @param str
 *            字符串、obj object 对象
 */
public interface DAO {
	/**
	 * 保存对象
	 * 
	 * @param str
	 *            字符串、obj object 对象
	 */
	public Object save(String s, Object obj) throws Exception;
	
	/**
	 * 批量添加
	 * @param s
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public Object saveBatch(String s, List list) throws Exception;
	/**
	 * 修改对象
	 * 
	 * @param str
	 *            字符串、obj object 对象
	 */
	public Object update(String s, Object obj) throws Exception;

	
	/**
	 * 批量更新
	 * @param s
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public Object updateBatch(String s,List list)throws Exception;
	
	/**
	 * 批量更新
	 * @param s
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public Object updateBatch(String s ,Object obj[])throws Exception;
	
	/**
	 * 删除对象
	 * 
	 * @param str
	 *            字符串、obj object 对象
	 */
	public Object delete(String str, Object obj) throws Exception;
	
	/**
	 * 批量删除
	 * @param str
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public Object deleteBatch(String str, Object obj [])  throws Exception;
	
	/**
	 * 批量删除
	 * @param str
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public Object deleteBatch(String str, List list)  throws Exception;
	

	/**
	 * 查找对象
	 * 
	 * @param Str
	 *            字符串、obj object 对象
	 * @return object
	 */
	public Object findForObject(String s, Object obj) throws Exception;

	/**
	 * 查找对象
	 * 
	 * @param Str
	 *            字符串、obj object 对象
	 * @return objectList
	 */
	public Object findForList(String s, Object obj) throws Exception;
	
	/**
	 * 查找对象封装成Map
	 * @param s
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public Object findForMap(String sql, Object obj, String key , String value) throws Exception;
	
	/**
	 * 得到总记录
	 * 
	 * @param str
	 *            字符串、obj object 对象
	 * @return 总记录数
	 */
	public long getcount(String s, Object obj) throws Exception;
	
	
	/**
	 * wap分页公用方法
	 * @param page
	 * @param pd
	 * @return
	 * @throws Exception
	 */
	public WapPage findWapPage(WapPage page ,PageData pd) throws Exception;

}


5.dao实现类

package com.sdjt.dao.base;

import java.sql.SQLException;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.orm.ibatis.SqlMapClientCallback;
import org.springframework.orm.ibatis.SqlMapClientTemplate;

import com.ibatis.sqlmap.client.SqlMapExecutor;
import com.sdjt.util.page.PageData;
import com.sdjt.wap.base.WapPage;

/**
 * @autor oliver
 * @email wangxiaojun0618@163.com
 * @data 2010.10.26
 * @description dao包基类
 * 
 */
public abstract class DaoSupport implements DAO {
	// sqlmapclient
	@Resource(name = "sqlMapClientTemplate")
	protected SqlMapClientTemplate sqlMapClientTemplate;

	/**
	 * 添加
	 * 
	 * @param String
	 *            statement 的id标识
	 * @param paramObj
	 *            业务bean
	 */
	public Object save(String str, Object paramObj) throws Exception {
		Object obj = sqlMapClientTemplate.insert(str, paramObj);
		return obj;
	}

	/**
	 * 修改
	 * 
	 * @param String
	 *            statement 的id标识
	 * @param paramObj
	 *            业务bean
	 */
	public Object update(String str, Object paramObj) throws Exception {
		Object obj = sqlMapClientTemplate.update(str, paramObj);
		return obj;

	}

	/**
	 * 删除
	 * 
	 * @param String
	 *            statement 的id标识
	 * @param paramObj
	 *            业务bean
	 */
	public Object delete(String str, Object paramObj) throws Exception {
		Object obj = sqlMapClientTemplate.delete(str, paramObj);
		return obj;
	}

	/**
	 * @查询对象
	 * @param String
	 *            statement 的id标识
	 * @param paramObj
	 *            业务bean
	 * @return 返回一个对象
	 * 
	 */
	public Object findForObject(String str, Object paramObj) throws Exception {
		Object obj = (Object) sqlMapClientTemplate
				.queryForObject(str, paramObj);
		return obj;
	}

	/**
	 * @查询对象List
	 * @param String
	 *            statement 的id标识
	 * @param paramObj
	 *            业务bean
	 * @return 返回一个对象list
	 * 
	 */
	public Object findForList(String str, Object paramObj) throws Exception {
		Object obj = (Object) sqlMapClientTemplate.queryForList(str, paramObj);
		return obj;
	}

	/**
	 * 得到对象的个数
	 */
	public long getcount(String str, Object paramObj) throws Exception {
		return 1;
	}

	/** 得到运行的实体类 */
	public String getSubClass() throws Exception {
		System.out.println("this" + this.getSubClass().getClass());
		return "";
	}

	/**
	 * 批量删除
	 */
	public Object deleteBatch(final String str, final Object obj[])
			throws Exception {
		return sqlMapClientTemplate.execute(new SqlMapClientCallback() {
			public Object doInSqlMapClient(SqlMapExecutor executor)
					throws SQLException {
				executor.startBatch();
				for (Object id : obj) {
					executor.delete(str, id);
				}
				return executor.executeBatch();
			}
		});
	}

	/**
	 * 批量删除
	 */
	public Object deleteBatch(final String str, final List list)
			throws Exception {
		return sqlMapClientTemplate.execute(new SqlMapClientCallback() {
			public Object doInSqlMapClient(SqlMapExecutor executor)
					throws SQLException {
				executor.startBatch();
				for (Object id : list) {
					executor.delete(str, id);
				}
				return executor.executeBatch();
			}
		});
	}

	public Object saveBatch(final String sql, final List list) throws Exception {
		return sqlMapClientTemplate.execute(new SqlMapClientCallback() {
			public Object doInSqlMapClient(SqlMapExecutor executor)
					throws SQLException {
				executor.startBatch();
				for (Object obj : list) {
					executor.insert(sql, obj);
				}
				return executor.executeBatch();
			}
		});
	}

	public Object updateBatch(final String sql, final Object[] obj)
			throws Exception {
		return sqlMapClientTemplate.execute(new SqlMapClientCallback() {
			public Object doInSqlMapClient(SqlMapExecutor executor)
					throws SQLException {
				executor.startBatch();
				for (Object o : obj) {
					executor.update(sql, o);
				}
				return executor.executeBatch();
			}
		});
	}

	public Object updateBatch(final String sql, final List list)
			throws Exception {
		return sqlMapClientTemplate.execute(new SqlMapClientCallback() {
			public Object doInSqlMapClient(SqlMapExecutor executor)
					throws SQLException {
				executor.startBatch();
				for (Object id : list) {
					executor.delete(sql, id);
				}
				return executor.executeBatch();
			}
		});
	}

	/**
	 * wap分页公用方法
	 * 
	 * @param page
	 * @param pd
	 * @return
	 * @throws Exception
	 */
	public WapPage findWapPage(WapPage page, PageData pd) throws Exception {
		String sqlId = page.getSqlId();
		Object count = sqlMapClientTemplate.queryForObject(sqlId + "Count", pd); // 查询总条数
		int totol = (count == null ? 0 : (Integer) count);
		page.setTotalRowCount(totol);
		if(totol != 0) {
			pd.put("curentNum", (page.getCurrentPage() - 1) * page.getRowOfpage());
			pd.put("pageSize", page.getRowOfpage());
			List<PageData> lists = (List<PageData>) sqlMapClientTemplate
					.queryForList(sqlId,pd);
			page.setObjectList(lists);
		}
		return page;
	}

	
	public Object findForMap(String sql, Object obj, String key , String value) throws Exception {
		return  sqlMapClientTemplate.queryForMap(sql, obj, key, value);
		
	}
	
	
}



6.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="wxjuser">
	<!-- 类起别名 -->
	<typeAlias alias="pd" type="com.sdjt.util.page.PageData" />
	<insert id="add" parameterClass="pd">
		INSERT INTO testuser(
		username,
		password,
		email,
		birthday,
		address,
		createtime,
		modtime,
		sign,
		bak)
		VALUES(
		#username#,
		#password#,
		#email#,
		#birthday#,
		#address#,
		now(),
		now(),
		0,
		#bak#)
	</insert>
</sqlMap>

  • src.rar (530 KB)
  • 下载次数: 104
  • 1.rar (7.9 MB)
  • 下载次数: 65
  • 2.rar (8.6 MB)
  • 下载次数: 66
  • 4.rar (8.8 MB)
  • 下载次数: 78
  • 3.rar (8.5 MB)
  • 下载次数: 72
分享到:
评论

相关推荐

    struts2+spring3+ibatis项目整合案例

    在这个“struts2+spring3+ibatis项目整合案例”中,我们将深入探讨这三个框架如何相互配合,实现项目的集成。 Struts2作为MVC(Model-View-Controller)架构的实现,主要负责处理用户请求,控制应用的流程。它提供...

    struts2+spring2+ibatis

    在这个案例中,开发者可能创建了一个简单的Web应用,包括了Struts2的Action类、Spring的Bean配置以及iBatis的数据访问对象(DAO)和SQL映射文件。 在实际的整合过程中,通常会首先配置Struts2的核心配置文件(struts...

    struts2+spring+ibatis+jquery ajax的登陆注册实时验证

    通过这个综合性的案例,我们可以看到Struts2、Spring、iBatis和jQuery AJAX如何协同工作,构建一个具有实时验证功能的登录注册系统。这种集成方案在实际开发中非常常见,因为它既能保证代码的清晰结构,又能提供优秀...

    struts2 + spring + ibatis 项目案例

    NULL 博文链接:https://hanqifeng.iteye.com/blog/840945

    SSI Spring+struts1+ibatis案例

    在这个"Spring+struts1+ibatis案例"中,我们将深入探讨这三个框架如何相互配合,以及它们各自的核心功能。 首先,Spring框架是Java企业级应用的核心组件,它提供了依赖注入(Dependency Injection, DI)和面向切面...

    liferay + struts2 + spring + ibatis整合开发案例

    "liferay + struts2 + spring + ibatis"的整合开发案例就是一个典型示例,它展示了如何将这四个强大的技术结合在一起,构建出一个功能丰富的Web应用程序。下面我们将详细探讨这些技术以及它们在整合中的作用。 **...

    struts2+spring+ibatis做的增删改查的小例子

    Struts2、Spring和iBatis是Java Web开发中三个非常重要的开源框架,它们的集成应用,即SSI2(Struts2 + Spring + iBatis)整合,是构建企业级应用的常见方式。这个"struts2+spring+ibatis做的增删改查的小例子"是一...

    struts+spring+ibatis+mysql实例

    struts spring ibatis mysql 分页,增删改查,以及导出excle

    struts+spring+ibatis+mysql整合小例子(适用于新手)

    Struts、Spring、Ibatis和Mysql是Java Web开发中常用的四大框架,它们组合在一起可以构建出高效、灵活的企业级应用程序。本示例是专为新手设计的一个整合教程,通过详细注解帮助初学者理解这四个组件如何协同工作。 ...

    struts2+spring+ibatis增删改查

    Struts2、Spring和...综上所述,这个案例涵盖了Struts2+Spring+iBatis框架的典型应用场景,通过学习和实践这个案例,开发者可以深入理解这三大框架的协同工作原理,为开发高效、稳定的Java Web应用打下坚实的基础。

    SSI(struts2+iBatis+spring2)

    标题中的"SSI"是指Struts2、iBatis和Spring2这三种技术的集成框架,常用于构建Java Web应用程序。这三种框架分别承担着不同的职责,共同构建了一个高效、灵活且可扩展的后端系统。 1. **Struts2**: Struts2是一个...

    struts2+spring+ibatis

    这个"struts2+spring+ibatis客户管理"项目,是一个简单的SSI(Struts2、Spring、iBatis集成)综合案例,旨在帮助开发者理解和实践这三大框架的协同工作。 Struts2是基于MVC设计模式的开源Web应用框架,它负责处理...

    spring+struts2+ibatis整合

    在IT行业中,Spring、Struts2和iBatis是三个非常重要的开源框架,它们分别在控制层、表现层和数据访问层发挥着关键作用。整合这三个框架可以构建出高效、可维护的企业级Web应用。接下来,我们将深入探讨这三个框架的...

    struts1+spring2+ibatis2开发的用户登录案例

    struts1+spring2+ibatis2开发的用户登录案例 用简单的语言带你进入javaweb开发 体会实用ibatis开发带来的快乐 就是配置ibatis文件有点麻烦,但是配置好后,就会用得很爽 对于想学习的人来说,这是很好的一个案例

    eclipse开发的ssi整合struts2+ibatis2.x+spring2.5

    总的来说,"eclipse开发的ssi整合struts2+ibatis2.x+spring2.5"是一个实用的学习案例,旨在帮助新手理解这三大框架的协同工作方式。通过实际操作,可以加深对Java Web开发的理解,提升项目开发技能。

    struts1.2+spring+ibatis

    Struts1.2、Spring 和 iBatis 是Java Web开发中的三个重要框架,它们共同构建了一个灵活、可扩展且易于管理的应用程序架构。这个压缩包文件 "struts1.2+spring+ibatis.rar" 很可能包含了使用这三个框架集成开发的一...

    SPRING + STRUTS + IBATIS测试案例

    在"SPRING + STRUTS + IBATIS测试案例"中,我们可以深入学习这三者如何协同工作。首先,Spring作为基础框架,通过XML配置或注解方式来定义和管理Bean,包括Struts的Action类和iBatis的SqlMapClient。JDK1.5的使用...

    ibatis+spring+struts2 整合开发例子

    "ibatis+spring+struts2 整合开发例子"就是一个典型的Java Web应用集成开发案例,旨在帮助开发者理解和掌握这三大框架的协同工作原理。接下来,我们将详细讨论这三个组件以及它们的整合过程。 Ibatis是一个轻量级的...

    Struts2+Spring+ibatis集成案例(实现了增删查改功能)

    在这个集成案例中,我们将深入探讨如何实现Struts2、Spring和iBatis的整合,并实现增删查改(CRUD)的基本功能。 首先,Struts2是基于MVC设计模式的开源Web应用框架,用于处理用户请求并展示结果。它的核心是Action...

Global site tag (gtag.js) - Google Analytics