2009.03.03 / 标签:
struts,
Struts2 / 分类:
J2EE技术
开始学习Struts2喽。Struts2与Strust1的配置方式几乎完全不同。先从struts.apache.org上下载了最新的struts2-2.1.6,由于目前还没有什么IDE支持Struts2,所以只能自己手工配置了。不过我也喜欢手工配置,什么东西都由工具来生成没有什么意思,脱离了工具就成白痴了。
第一步,导包。下载下来的jar包并不是全都要,只需要下面这6个包即可。
1.commons-logging-1.0.4.jar
2.commons-fileupload-1.2.1.jar
3.freemarker-2.3.13.jar
4.ognl-2.6.11.jar
5.struts2-core-2.1.6.jar
6.xwork-2.1.2.jar
以上6个包,缺一不可。
第二步,修改web.xml。增加如下配置:
[xml]
<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>
[/xml]
第三步,增加struts.xml文件。在struts1中,我们配置ActionForm及Action时是在strust-config.xml中,而在struts2中则是在struts.xml中,且该文件必须位于WEB-INF\classes目录下。
[xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2" extends="struts-default">
</package>
</struts>
[/xml]
经过上面这三步,Struts2就已经基本配置完成了。
SSH集成的一个样例,放到这里方便自己以后使用。其实就是一些配置,也没什么先后顺序。
web.xml增加
<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>
修改Struts-config.xml中action的type属性为org.springframework.web.struts.DelegatingActionProxy
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans >
<form-bean name="userForm" type="cn.ineeke.ssh.web.form.UserForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="userForm"
input="/index.jsp"
name="userForm"
parameter="action"
path="/user"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="userlist" path="/list.jsp"/>
<forward name="toUpdate" path="/user_info.jsp"/>
</action>
</action-mappings>
<message-resources parameter="cn.ineeke.ssh.web.ApplicationResources" />
</struts-config>
对action进行注入,name属性必须与上面配置信息中action的path一致,class属性值为具体的action类。
<?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.5.xsd">
<bean name="/user" class="cn.ineeke.ssh.web.action.UserAction">
<property name="userBiz" ref="userBiz"/>
</bean>
</beans>
hibernate.cfg.xml的配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/ssh
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.password">www.ineeke.com</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="show_sql">true</property>
<mapping resource="cn/ineeke/ssh/entity/TUser.hbm.xml" />
</session-factory>
</hibernate-configuration>
配置AOP
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 配置事务的传播性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置哪些类及其哪些方法参与该事务 -->
<aop:config>
<aop:pointcut id="allMethod" expression="execution(* cn.ineeke.ssh.biz.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethod"/>
</aop:config>
</beans>
2009.01.03 / 标签:
hibernate,
struts / 分类:
J2EE技术
昨天在Action中完成某一个更新功能的时候总是无法更新成功,而且什么错误都不报。经过仔细而又认真的再三查找,终于被我找到问题所在了。
先来说说查错过程。首先从更新失败与不报任何错误来看,我们的代码肯定是没有错的,错误应该是出在DAO层的SQL语句中。经查证,SQL语句也是正确的。给出SQL语句具体来看看。
String sql = "UPDATE tb_member SET name=?,password=?,reallyName=?,age=?,profession=?,email=?,question=?,result=? WHERE id=? ";
boolean ok = false;
try {
conn = DB.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, mbr.getMbrName());
pstmt.setString(2, mbr.getMbrPassword());
pstmt.setString(3, mbr.getMbrReallyName());
pstmt.setInt(4, mbr.getAge());
pstmt.setString(5, mbr.getMbrProfession());
pstmt.setString(6, mbr.getMbrEmail());
pstmt.setString(7, mbr.getMbrQuestion());
pstmt.setString(8, mbr.getMbrResult());
pstmt.setInt(9, mbr.getMbrId());
int i = pstmt.executeUpdate();
if(i > 0){
ok = true;
}
如上SQL语句,可以看到它是一个带更新条件的SQL语句(废话啊⊙﹏⊙b),那么在什么情况下这条语句可以正常执行而又返回的更新行数i又小于或等于0呢?答案就是,这里id的值在这张表中并不存在!
从上面的代码可以看到,这里的id是由pstmt.setInt(9, mbr.getMbrId())来赋值的。使用System.out.println(mbr.getMbrId())打印输出得到结果为0,其他属性值都存在。那就是说我们可能在Action中对mbr进行赋值时忘记了id属性。再检查一下Action中的方法。
public ActionForward doUpdate(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception{
MemberForm memberForm = (MemberForm) form;// TODO Auto-generated method stub
HttpSession session = request.getSession();
String forwardName = "failure";
//获得当前会员信息
Member mbr = (Member)session.getAttribute("member");
//判断是否已经登录
if(mbr != null){
//赋值
BeanUtils.copyProperties(mbr, memberForm);
//更新会员信息
if(mbrBiz.updateMember(mbr)){
forwardName = "success";
}
}
return mapping.findForward(forwardName);
}
打眼一看好像也没错啊!起初我也认为绝对没错,我还以为是Tomcat的问题呢。后来仔细琢磨了一下BeanUtils.copyProperties(mbr, memberForm)这行代码。memberForm是前端控制器ActionServlet自动填充的,它封装了JSP页面中的表单数据。我使用BeanUtils.copyProperties()将memberForm中的各属性值逐一赋给mbr中的各个属性。这时我才突然明白了,我的JSP页面的表单中并不存在id这一数据!我将memberForm的id属性打印出来为null,由于BeanUtils.copyProperties()的内部实现机制的问题,这里它自动将mbr的id属性改为了0,于是就造成了更新不成功也不报错的结果。
那么,该怎么改好呢?很简单!在使用BeanUtils.copyProperties()方法之前先执行一下memberForm.setMbrId(mbr.getMbrId())即可。如此简单的一个问题花了我半个多小时,再加上分析整理写出来就更多了,O(∩_∩)O哈哈~。
在MyEclipse中配置好了Hibernate,运行的时候出现了两行红字,其意就是log4j没有配置,检查了一下发现果然没有配置。第一次用,哪会配置这东西啊!我以为这个MyEclipse也会自动生成呢!百度吧~
阅读全文>>
客户端浏览器向WEB服务器上传文件是件比较复杂的事,之前我们有[jsp实现文件上传]和[Servlet中实现文件上传] 这两种方式,我们发现那都需要写很多代码,而使用Struts为我们提供的文件上传机制就简单容易的多了。
阅读全文>>
2008.12.19 / 标签:
struts,
struts教程 / 分类:
J2EE技术
为什么要有动态ActionForm呢?若在一个大型项目中,我们的ActionForm可能会很多,而使用动态ActionForm的话,我们就不需要去写那么多类文件了,我们可以直接在配置文件中配置所需要的ActionForm。
下面我们来看看如何配置动态ActionForm。首先我们创建一个JSP页面用于提交数据和显示数据。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>动态ActionForm测试</title>
</head>
<body>
<form action="dynaactionform.do" method="post">
用户名:<input type="text" name="userName"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
上面的代码中我们创建一个form表单,表单中有userName和password两项提交给dynaactionform.do进行处理。
接着创建我们的Action,其代码如下:
package cn.ineeke.dynamicactionform.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
public class DynaFormAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
DynaActionForm dynaForm = (DynaActionForm)form;
System.out.println(dynaForm.get("userName"));
System.out.println(dynaForm.get("password"));
return mapping.findForward("success");
}
}
上面的DynaFormAction同样也是继承自Action这个类,而在execute方法中我们将前端控制器传给我们的form强制转换成DynaActionForm(动态ActionForm)类型,并调用其get方法输出各属性值,之后进行跳转。
接下来配置struts-config.xml文件,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="userName" type="java.lang.String"></form-property>
<form-property name="password" type="java.lang.String"></form-property>
</form-bean>
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
<action path="/dynaactionform"
type="cn.ineeke.dynamicactionform.action.DynaFormAction"
name="dynaForm"
scope="request"
>
<forward name="success" path="/dynaform.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="cn.ineeke.struts.ApplicationResources" />
</struts-config>
在struts-config.xml中我们配置了一个ActionForm和一个Action,这个ActionForm有两个属性,分别是userName和password以及其数据类型。其中org.apache.struts.action.DynaActionForm这个类是Struts所为我们提供的,我们就是使用它实现动态ActionForm的。
动态ActionForm动在何处呢?就动在form-bean的配置中。我们可以使用<form-property>动态的配置ActionForm的各个属性。
不想写Java中的for循环?还想用标签进行数据迭代?让Struts中的login:iterate标签来帮你吧!这里有一个简单的实例,你是否能够学会呢?
阅读全文>>
在[
Struts bean:write filter
] 一文中我们了解了Struts中bean:write标签的filter属性。接下来我们来看看如何使用Struts中bean:write的format属性。
首先我们来看看如何使用format属性进行格式化输出。我们在request中放入当前时间。
request.setAttribute("time", new Date());
在JSP页面中,倘若我们不使用format属性进行格式化,而直接使用<bean:write name="time" scope="request"/>进行输出,其输出结果将是:
Sun Dec 14 15:38:51 CST 2008
然而我们通常不习惯于使用这种格式,如果我们希望输出这种格式2008-12-14 15:41:12呢?很简单!我们将其代码修改成这样:
<bean:write name="time" scope="request" format="yyyy-MM-dd HH:mm:ss"/>
这里format属性中的内容我想不需要解释吧?O(∩_∩)O~
时间可以格式化,那么数字呢?
我们向request中放入圆周率request.setAttribute("n", 3.14159265358979323846)。若直接使用<bean:write name="n" scope="request"/>进行输出,那结果肯定是原封不动的3.14159265358979323846了。如果我们希望小数点后保留4位呢?也很简单!代码修改为:
<bean:write name="n" scope="request" format="#.####" />
再想想,如果我们放进去的是3.14呢?我们输出却要小数点后保留4位,不足4位用0补上呢?用上面的方式我们得到将还是3.14,这又该怎么改呢?
It’s very easy!!一个非常小的改动:
<bean:write name="n" scope="request" format="0.0000" />或者<bean:write name="n" scope="request" format="#.0000" />
有人会发现这里的“#”与“0”好像通用,于是写成<bean:write name="n" scope="request" format="#.##00" />,认为这样也可以,究竟行不行自己动手试试吧。
2008.12.13 / 标签:
struts,
struts 标签 / 分类:
J2EE技术
Struts中的<bean:write name="neeke" scope="request" />标签相当于<%=request.getAttribute("neeke")%>,当然这里也不一定是request,也可能是session等,其中neeke是属性的名字。
首先我们来看一看action中的代码。
- package cn.ineeke.struts;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
-
- public class BeanWriteAction extends Action {
-
- @Override
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- request.setAttribute("myblog", "<a href=’http://www.ineeke.com’>http://www.ineeke.com</a>");
- return mapping.findForward("success");
- }
-
- }
package cn.ineeke.struts;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;public class BeanWriteAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("myblog", "<a href='http://www.ineeke.com'>http://www.ineeke.com</a>"); return mapping.findForward("success"); }}
上面这段代码的作用很简单,就是向request中存值,接着跳转到成功页面。再来看看成功页的代码是什么样的。
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Struts标签BeanWrite学习</title>
- </head>
- <body>
- <bean:write name="myblog" scope="request"/>
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>Struts标签BeanWrite学习</title> </head> <body> <bean:write name="myblog" scope="request"/> </body></html>
在上面的代码中,我们使用<bean:write>标签从request中将myblog取出并显示在网页上。此时是按照文本格式直接输出的,而我们存放的时候是带HTML代码的,如果我们想让它以超级链接的形式显示在网页中呢?
其实这很简单,此标签有一个filter属性,其意在于是否以文本格式输出,默认情况下其值为true,所以我们只需将其改为如下所示即可。
<bean:write name="myblog" scope="request" filter="false"/>
2008.12.05 / 标签:
struts / 分类:
J2EE技术
一般我们都是一个表单根据不同的业务提交给不同的Action去处理。可是如果一个项目很大,那么我需要编写的Action就暴增了,这样容易发生混乱。如何才能使用一个Action来处理这些操作呢?那就需要DispatchAction了。
通常,一个Actio中只能完成一种业务操作,通过扩展org.apache.struts.actions.DispatchAction实现的Action类可以完成一组相关的几种业务操作。扩展自DispatchAction的Action类中不必定义execute方法,而是创建一些实现实际业务操作的方法,如doAdd()、doSubtract()等,但是这些业务方法的传入参数和返回值要和普通的Action中的execute方法相同。下面我们以一个简单的计算器为例来讲解。
JSP页面上我们编写这样的代码:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>计算器</title>
- <script type="text/javascript">
- function changeSubmit(operate){
- document.getElementById("operate").value = operate;
- }
- </script>
- </head>
- <body>
- <form action="calc.do" method="post">
- <input type="text" name="firstNumber"><br>
- <input type="text" name="secondNumber"><br>
- <input type="hidden" name="operate" id="operate">
- <input type="submit" value="doAdd" onclick="changeSubmit(‘doAdd’)">
- <input type="submit" value="doSubtract" onclick="changeSubmit(‘doSubtract’)">
- <input type="submit" value="doMultiply" onclick="changeSubmit(‘doMultiply’)">
- <input type="submit" value="doDivide" onclick="changeSubmit(‘doDivide’)">
- </form>
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>计算器</title> <script type="text/javascript"> function changeSubmit(operate){ document.getElementById("operate").value = operate; } </script> </head> <body> <form action="calc.do" method="post"> <input type="text" name="firstNumber"><br> <input type="text" name="secondNumber"><br> <input type="hidden" name="operate" id="operate"> <input type="submit" value="doAdd" onclick="changeSubmit('doAdd')"> <input type="submit" value="doSubtract" onclick="changeSubmit('doSubtract')"> <input type="submit" value="doMultiply" onclick="changeSubmit('doMultiply')"> <input type="submit" value="doDivide" onclick="changeSubmit('doDivide')"> </form> </body></html>
而处理这些请求的Action的代码如下:
- * Generated by MyEclipse Struts
- * Template path: templates/java/JavaClass.vtl
- */
- package cn.ineeke.struts.action;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionMapping;
- import org.apache.struts.actions.DispatchAction;
-
- import cn.ineeke.struts.form.CalcForm;
-
- * MyEclipse Struts
- * Creation date: 12-03-2008
- *
- * XDoclet definition:
- * @struts.action path="/calc" name="CalcForm" parameter="operate" scope="requ
est"
- * @author Neeke http://www.ineeke.com
- */
- public class CalcAction extends DispatchAction {
-
- public void doAdd(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()+calcForm.getSecondNumber());
- }
- public void doSubtract(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()-calcForm.getSecondNumber());
- }
- public void doMultiply(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()*calcForm.getSecondNumber());
- }
- public void doDivide(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- CalcForm calcForm = (CalcForm)form;
- System.out.println(calcForm.getFirstNumber()/calcForm.getSecondNumber());
- }
-
- }
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */package cn.ineeke.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;import cn.ineeke.struts.form.CalcForm;/** * MyEclipse Struts * Creation date: 12-03-2008 * * XDoclet definition: * @struts.action path="/calc" name="CalcForm" parameter="operate" scope="request" * @author Neeke http://www.ineeke.com */public class CalcAction extends DispatchAction { public void doAdd(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()+calcForm.getSecondNumber()); } public void doSubtract(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()-calcForm.getSecondNumber()); } public void doMultiply(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()*calcForm.getSecondNumber()); } public void doDivide(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CalcForm calcForm = (CalcForm)form; System.out.println(calcForm.getFirstNumber()/calcForm.getSecondNumber()); } }
接下来具体分析。首先定义CalcAction继承自DispatchAction。正如上面所说的,这里没有execute方法,而是直接定义相关业务操作的方法,CalcAction的配置如下:
- <action-mappings >
- <action
- attribute="CalcForm"
- name="CalcForm"
- parameter="operate"
- path="/calc"
- scope="request"
- type="cn.ineeke.struts.action.CalcAction"
- validate="false" />
- </action-mappings>
<action-mappings > <act
ion attribute="CalcForm" name="CalcForm" parameter="operate" path="/calc" scope="request" type="cn.ineeke.struts.action.CalcAction" validate="false" /></action-mappings>
与普通的Action唯一不同之处就是多了一个parameter属性。这个属性告诉Struts从请求对象中找名称为operate的参数值,参数值是什么就到CalcAction中执行与之同名的方法。在表单提交时,使用JavaScript将隐藏表单域operate的值修改为想要执行的CalcAction中的方法名。
最后,在DispatchAction中,方法名的前缀也常常遵循一定的规则:转到编辑页面的方法常命名为toEdit;执行编辑操作的方法常命名为doEdit;以此类推。通过这样的命名、可以使程序逻辑更清晰,减少出错几率。