Spring整合Struts1.X
新建web工程 composeStruts ,使用MyEclipse先后加入Struts1.2、Spring2.0
注意:选择 Spring2.0 jar包时注意将 Spring 2.0 web Libraries 导入,结构如下:
打开web.xml,加入Spring监听:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
到com.test.struts.action下新建action类:UserAction
- ackage com.test.struts.action;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- import org.springframework.context.ApplicationContext;
- import org.springframework.web.struts.ActionSupport;
- import com.test.spring.UserBean;
- import com.test.struts.form.UserForm;
- public class UserAction extends Action {
- private UserBean userbean;
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- UserForm userForm = (UserForm) form;
- return null;
- }
- public UserBean getUserbean() {
- return userbean;
- }
- public void setUserbean(UserBean userbean) {
- this.userbean = userbean;
- }
- }
到com.test.struts.form下新建form类:UserForm
- package com.test.struts.form;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts.action.ActionErrors;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionMapping;
- public class UserForm extends ActionForm {
- private String uname;
- private String upwd;
- public ActionErrors validate(ActionMapping mapping,
- HttpServletRequest request) {
- return null;
- }
- public void reset(ActionMapping mapping, HttpServletRequest request) {
- }
- public String getUname() {
- return uname;
- }
- public void setUname(String uname) {
- this.uname = uname;
- }
- public String getUpwd() {
- return upwd;
- }
- public void setUpwd(String upwd) {
- this.upwd = upwd;
- }
- }
还需要有一个Spring管理bean,到com.test.spring下新建类:UserBean
- package com.test.spring;
- public class UserBean {
- private String username;
- private String userpwd;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getUserpwd() {
- return userpwd;
- }
- public void setUserpwd(String userpwd) {
- this.userpwd = userpwd;
- }
- }
在 WebRoot下加入两个jsp文件:
index.jsp:
- <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Test</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <body>
- <a href="/testCompose/user.do">Click me</a>
- </body>
- </html>
main.jsp:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Test OK</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- </head>
- <body>
- <li><h1>name:${userForm.uname}</h1></li>
- <li><h1>name:${userForm.upwd}</h1></li>
- </body>
- </html>
打开ApplicationContext.xml,加入数据管理bean并初始化数据:
<bean id="userbean" class="com.test.spring.UserBean" >
<property name="username" value="admin"></property>
<property name="userpwd" value="123456"></property>
</bean>
下面开始整合工作:
Spring整合Struts1.X有三种方式,第一种是以插件形式利用Struts-Config.xml进行整合的方式:
1、改动UserAction,将父类更改为Spring中org.springframework.web.struts包下的ActionSupport类:
- ...
- public class UserAction extends ActionSupport {
- ...
类中有私有属性:
private UserBean userbean;
及其它相关的set、get方法,以便在Spring中注入属性。
接着在execute方法中加入更改代码:
- ApplicationContext context = getWebApplicationContext();
- this.setUserbean((UserBean)context.getBean("userbean"));
- System.out.println("用户名" + this.getUserbean().getUsername() + " 密码:" + this.getUserbean().getUserpwd());
- return mapping.findForward("testok");
打开Struts-Config.xml,在资源文件 <message-resources parameter="com.test.struts.ApplicationResources" /> 后加入插件:
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
- </plug-in>
注意applicationContext.xml的位置,MyEclipse导入Spring后,默认是在src目录下生成此文件。如果不想移动到WEB-INF下,可以写为:
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml"/>
- </plug-in>
这样就保证了Struts-Config.xml被启动的同时也读取了applicationContext.xml。
注意,Action类继承了Spring包下的ActionSupport,而 getWebApplicationContext() 方法正是 ActionSupport 类提供的,他返回了由Struts启动的Spring配置文件上下文。因此 UserAction 通过这两句可轻易获取Spring容器,并获得需要的bean。可达到整合目的。但这样做的缺点是将Spring与Struts的距离拉近了,如Spring的xml发生变化,如beanID发生更改,那Struts的代码必须也跟着改。明显离 Spring Struts 达到 兵不识将 将不知兵的状态太远。
二、使用 DelegatingRequestProcessor 或 DelegatingActionProxy
1、将Action类改回原来继承的Struts Action类;
2、删除示例一中获得Spring上下文、获得Spring管理bean的前两句代码,保留后两句代码;
3、依然保留从Struts-Config.xml 启动Spring配置;
在Struts-Config.xml找到userAction声明:
- <action
- attribute="userForm"
- name="userForm"
- path="/user"
- scope="request"
- type="com.test.struts.action.UserAction" >
- <forward name="testok" path="/main.jsp"></forward>
- </action>
将type属性更改为:org.springframework.web.struts.DelegatingActionProxy。
目的是把action的type设定为Spring管理的struts action代理,这样 Struts 并不与Spring 发生代码上的联系,只需要 — Spring 把请求拦截转发到 Spring 管理的相应管理bean中。
如果action比较多,每个都更改太繁琐的话,可以在资源文件声明前加上:
- <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
使用了DelegatingRequestProcessor类,则action声明中的type属性都可以不要了,所有的Action请求都会被DelegatingRequestProcessor 自动转发。
而这三者的顺序一定得是:
<controller .....
<message-resources .....
<plug-in .....
否则会报Struts-Config.xml的配置节点错误,虽然亦可运行,但报错始终是不大好看的。
Struts-Config.xml 改造好以后,回头来看ApplicationContext.xml
由于Struts通过DelegatingActionProxy代理或DelegatingRequestProcessor类将用户请求都转发到Spring来处理,Spring接收请求后,会在Context上下文查找与用户请求相关的管理bean。因此,在App...xml要需要有跟Struts-Config.xml中Action声明设定的name属性一模一样的bean。如:
Struts-Config.xml中有:
- <action
- attribute="userForm"
- name="userForm"
- path="/user"
- scope="request">
- <forward name="testok" path="/main.jsp"></forward>
- </action>
ApplicationContext.xml中就应该有:
- <bean name="/user" class="com.test.struts.action.UserAction">
- <property name="userbean" ref="userbean">
- </property>
- </bean>
它们的name是一模一样的,连"/"都不能落下,否则会发生500错误,报在Spring配置上下文中找不到"/user",发生空指针错误。还有bean中"/user"的属性只能是name,因为有反斜杠,id不能通过xml验证。
最终以插件形式一番整合下来,Struts-Config.xml内容为:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
- <struts-config>
- <data-sources />
- <form-beans >
- <form-bean name="userForm" type="com.test.struts.form.UserForm" />
- </form-beans>
- <global-exceptions />
- <global-forwards />
- <action-mappings >
- <action
- attribute="userForm"
- name="userForm"
- path="/user"
- scope="request">
- <forward name="testok" path="/main.jsp"></forward>
- </action>
- </action-mappings>
- <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
- <message-resources parameter="com.test.struts.ApplicationResources" />
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
- </plug-in>
- </struts-config>
ApplicationContext.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="userbean" class="com.test.spring.UserBean" >
- <property name="username" value="admin"></property>
- <property name="userpwd" value="123456"></property>
- </bean>
- <bean name="/user" class="com.test.struts.action.UserAction">
- <property name="userbean" ref="userbean">
- </property>
- </bean>
- </beans>
确定无误部署到Tomcat5.5下启动,在index.jsp下点击链接,可以看到页面已成功请求到Spring管理bean,最后跳转到main.jsp页面。
控制台打印出:
用户名admin 密码:123456
Spring整合Struts2.0
新建工程:ComposeStruts2,结构如下:
一、复制jar包
到 http://struts.apache.org/download.cgi#struts20112 下载Struts2包,建议用 2.0.11.2 版本。
xwork-2.0.4.jar
struts2-spring-plugin-2.0.11.1.jar
struts2-core-2.0.11.1.jar
ognl-2.6.11.jar
freemarker-2.3.8.jar
commons-logging-1.0.4.jar
Spring包:
MyEclipse加入 Spring Code包 Spring Web包
二、Struts2、Spring启动配置
Web.xml中加入Struts2启动配置:
- <display-name>Struts2Project</display-name>
- <filter>
- <filter-name>Struts_filter</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
- </filter>
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>Struts_filter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
Web.xml中加入Spring启动配置:
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext.xml</param-value>
- </context-param>
三、加入配置文件:
在工程src下,加入Struts配置文件: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" />
- <include file="struts-default.xml"/>
- <package name="default" extends="struts-default">
- <action name="user" class="useraction">
- <result name="testok">/main.jsp</result>
- </action>
- </package>
- </struts>
可以看到Struts2已经配置指定了Action的对象实例由Spring工厂产生,因此在下面action的class声明中已经不需要指定属性class的路径,指定路径的工作交由ApplicationContext.xml文件完成,Struts.xml只需要将Spring管理的Action类的beanid赋给class就可以了。
在WEB-INF下打开Spring配置文件:applicationContext.xml,在beans节点下加入
- <bean id="usermodel" class="com.test.model.UserModel">
- <property name="username" value="admin"></property>
- <property name="userpwd" value="123456"></property>
- </bean>
- <bean id="useraction" class="com.test.struts.action.UserAction" >
- <property name="usermodel" ref="usermodel"></property>
- </bean>
三:
在model下新建usermodel类:
- package com.test.model;
- public class UserModel {
- private String username;
- private String userpwd;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getUserpwd() {
- return userpwd;
- }
- public void setUserpwd(String userpwd) {
- this.userpwd = userpwd;
- }
- }
在action包下新建useraction类:
- package com.test.struts.action;
- import com.opensymphony.xwork2.ActionSupport;
- import com.test.model.UserModel;
- public class UserAction extends ActionSupport {
- private UserModel usermodel;
- private String errorstr;
- public String execute() throws Exception {
- if(usermodel.getUsername().equals("admin") && usermodel.getUserpwd().equals("123456")){
- System.out.println("验证通过");
- this.setErrorstr("TestOK");
- }
- else{
- this.setErrorstr("Test Error");
- }
- return "testok";
- }
- public UserModel getUsermodel() {
- return usermodel;
- }
- public void setUsermodel(UserModel usermodel) {
- this.usermodel = usermodel;
- }
- public String getErrorstr() {
- return errorstr;
- }
- public void setErrorstr(String errorstr) {
- this.errorstr = errorstr;
- }
- }
WebRoot下新建2个jsp文件
index.jsp
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Test struts2</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- </head>
- <body>
- <a href="/ComposeStruts2/simple/user.action">Click me</a>
- </body>
- </html>
main.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Test OK</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- </head>
- <body>
- <s:iterator id="usermodel" value="user">
- <s:property value="username" />
- <s:property value="userpwd" />
- </s:iterator>
- Test Result: <s:property value="errorstr" />
- </body>
- </html>
将工程部署到Tomcat下运行,如果单击 Click me 发生无法找到action的404错误,打开一下Tomcat目录 webapps 下的工程目录,打开web-inf下的lib,查看是否存在 log4j-x.x.x.jar 、asm 包,如果存在删除即可。
如无意外单击 Click me 链接后可看到链接通过 Struts.xml 中action节点定义的class属性,在ApplicationContext中找到与之相同的Spring管理bean,由此达到 Spring 管理 Struts Action 类的目的。
程序最终运行到 main.jsp :
Test Result: TestOK
如在ApplicationContext将UserModel初始值改变,将得到
Test Result: TestError
Spring 管理 Ibatis
一、数据库准备(Oracle):
新建数据库
create table userinfo
(
userid number(2),
username varchar2(15),
upwd varchar2(40)
)
插入测试数据
insert into userinfo values(1,'test1','123456')
insert into userinfo values(2,'test2','654321')
新建工程 ComposeIbatis,结构如图:
增加Myeclipse下Spring包,注意把COREAOP/WEB/,以及最重要的IBATIS ORM包导入
增加Struts2的jar包
增加 DB 驱动jar包
web.xml 下加入启动 Spring Struts
- ...........
- <display-name>Struts2Project</display-name>
- <filter>
- <filter-name>Struts_filter</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
- </filter>
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>Struts_filter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext.xml</param-value>
- </context-param>
- ................
在src下新建 struts.xml Struts配置文件:
- <?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" />
- <include file="struts-default.xml"/>
- <package name="default" extends="struts-default">
- <action name="user" class="useraction">
- <result name="testok">/main.jsp</result>
- </action>
- </package>
- </struts>
Struts.xml的配置中已经设定所有Struts对象将从Spring产生,如:在请求定义为 user 的 Action 时,系统会到 Spring 中查找id与之Action声明中的class属性相同的bean,将请求转发到这个bean中处理。
在struts包下放置action类及业务service类;
- package com.test.struts.action;
- import java.util.List;
- import com.opensymphony.xwork2.ActionSupport;
- import com.test.struts.service.UserService;
- public class UserAction extends ActionSupport {
- private UserService user;
- private List userlist;
- public String execute() throws Exception {
- List list = user.getUserInfo();
- this.setUserlist(list);
- return "testok";
- }
- public UserService getUser() {
- return user;
- }
- public void setUser(UserService user) {
- this.user = user;
- }
- public List getUserlist() {
- return userlist;
- }
- public void setUserlist(List userlist) {
- this.userlist = userlist;
- }
- }
这个类有一个属性需要 Spring 注入 - private UserService user; 在ApplicationContext.xml 中加入依赖注入:
- <bean id="useraction" class="com.test.struts.action.UserAction">
- <property name="user" ref="user_service"></property>
- </bean>
而注入是用ref 注入的,意味着 ApplicationContext.xml 中还应该有管理bean user_service。
暂且不管,在service包下加入业务service类UserService:
- package com.test.struts.service;
- import java.util.List;
- import com.test.dao.IUserDao;
- public class UserService {
- private IUserDao dao;
- public List getUserInfo()
- {
- List list = null;
- list = dao.getUserInfo();
- return list;
- }
- public synchronized IUserDao getDao() {
- return dao;
- }
- public synchronized void setDao(IUserDao dao) {
- this.dao = dao;
- }
- }
将这个服务类做为Spring管理bean user_service,这个bean就是 useraction 需要注入的bean:
- <bean id="user_service" class="com.test.struts.service.UserService">
- <property name="dao" ref="iBatisDao"></property>
- </bean>
而 UserService.java 类也有注入属性 dao ,于是管理bean 也用另外一个管理 bean iBatisDao 进行了依赖注入 。
暂且不管管理bean iBatisDao 的声明,到dao包下新建接口IUserDao:
- package com.test.dao;
- import java.util.List;
- public interface IUserDao {
- public List getUserInfo();
- }
及impl包下的接口实现类 UserImpl :
- package com.test.dao.impl;
- import java.util.List;
- import com.test.ibatis.sqlmap.StaticSqlString;
- import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
- import com.test.dao.IUserDao;
- public class UserImpl extends SqlMapClientDaoSupport implements IUserDao {
- public List getUserInfo() {
- List list = null;
- list = this.getSqlMapClientTemplate().queryForList(StaticSqlString.getSELECT_ALL_USER());
- System.out.println(list.size());
- return list;
- }
- }
注意 UserImpl 除了实现IUserDao 接口外,还集成了一个特殊的类:SqlMapClientDaoSupport 。 它是Spring提供的一个将Ibatis对象SqlMapClient 进行包装了的对象,使用这个对象将不会再去理会 SqlException ,SqlException将在这个类中得到Spring的处理,而它的使用方法完全与SqlMapCliect一样。而bean user_service 需要注入的bean iBatisDao 将用这个实现类进行注入。
- <!-- 使用iBatis实现的DAO -->
- <bean id="iBatisDao" class="com.test.dao.impl.UserImpl">
- <property name="sqlMapClient">
- <bean class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <property name="configLocation">
- <value>classpath:com/test/ibatis/sqlmap/sqlMapConfig.xml</value>
- </property>
- <property name="dataSource" ref="dataSource" />
- </bean>
- </property>
- </bean>
SqlMapClientDaoSupport 在Spring 配置中声明时,需要注入sqlMapClient实例,因此需要将 得到 IBatis 的配置文件 sqlMapConfig.xml 与数据库连接dataSource配置的sqlMapClient示例进行依赖注入。
下面是数据库连接bean:dataSource:
- <!-- 定义DataSource -->
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
- <property name="url" value="jdbc:oracle:thin:@10.132.224.XXX:1521:XXXX" />
- <property name="username" value="XXXXX" />
- <property name="password" value="XXXXX" />
- </bean>
到此 Spring 管理 Ibatis 的整合完成。
到 model 包下新建 Ibatis 数据模型类:UserModel -对应数据库表:userinfo表
- package com.test.model;
- import java.sql.Date;
- public class UserModel {
- private String userid;
- private String username;
- private String upwd;
- public String getUserid() {
- return userid;
- }
- public void setUserid(String userid) {
- this.userid = userid;
- ..............
- this.upwd = upwd;
- }
- }
到 sqlmap 包下新建 Ibatis 配置文件:sqlMapConfig.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE sqlMapConfig SYSTEM "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
- <sqlMapConfig>
- <sqlMap resource="com/test/ibatis/xml/x_test.xml" />
- </sqlMapConfig>
sqlmap包下新建负责传递Ibatis 需要的sql语句id类:StaticSqlString
- package com.test.ibatis.sqlmap;
- public class StaticSqlString {
- private static String SELECT_ALL_USER = "s_all_user";
- public static synchronized String getSELECT_ALL_USER() {
- return SELECT_ALL_USER;
- }
- public static synchronized void setSELECT_ALL_USER(String select_all_user) {
- SELECT_ALL_USER = select_all_user;
- }
- }
到xml包下新建Ibatis 查询配置文件:x_test.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE sqlMap SYSTEM "http://www.ibatis.com/dtd/sql-map-2.dtd">
- <sqlMap>
- <typeAlias alias="userinfo"
- type="com.test.model.UserModel" />
- <select id="s_all_user" resultClass="userinfo">
- <![CDATA[
- SELECT * FROM USERINFO
- ]]>
- </select>
- </sqlMap>
到webRoot下新建jsp文件:
index.jsp:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Test</title>
- </head>
- <body>
- <a href="/ComposeIbatis/user.action">Click Me</a>
- </body>
- </html>
main.jsp:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Test OK</title>
- </head>
- <body>
- <table>
- <s:iterator id="user" value="userlist">
- <tr>
- <td><s:property value="userid" /></td>
- <td><s:property value="userame" /></td>
- <td><s:property value="upwd" /></td>
- </tr>
- </s:iterator>
- </table>
- </body>
- </html>
部署运行,点击Click Me 提交请求到user.action ,请求将从Struts 转发到 Spring 管理 Bean 中,通过 Spring 的 SqlMapClientTemplate 获取到数据库数据,转而呈现在页面上。