如何在Struts框架下通过Velocity模板触发Java Action类执行
Struts2 + Velocity 下拉框变更触发Action完整实现示例
1. 修改Velocity模板(.vm文件)
调整你的表单代码,补充option的value属性、完善onchange事件逻辑,下拉框变更时自动提交表单到Action:
<form id="someFormId" name="someFormName" action="someFormAction" method="post"> <select id="someSelectId" name="someSelectName" onChange="this.form.submit()"> <option value="option1_value">option1</option> <option value="option2_value">option2</option> </select> </form> <!-- 如果需要显示Action返回的处理结果,可以直接引用Action属性 --> #if($processResult) <p>处理结果:$processResult</p> #end
如果你不需要页面刷新,也可以用异步提交方式,替换onChange的逻辑即可:
<select id="someSelectId" name="someSelectName" onChange="submitSelectValue()"> <!-- 下拉框option内容同上 --> </select> <script> function submitSelectValue() { const selectValue = document.getElementById('someSelectId').value; const xhr = new XMLHttpRequest(); xhr.open('POST', 'someFormAction'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = function() { if (xhr.status === 200) { // 处理返回的结果 console.log('处理完成', xhr.responseText); } }; xhr.send('someSelectName=' + encodeURIComponent(selectValue)); } </script>
2. 编写Struts Action类
定义和select的name属性同名的成员变量,生成getter/setter方法,Struts会自动将下拉框选中值注入到该变量中:
package com.yourpackage; import com.opensymphony.xwork2.ActionSupport; public class SelectProcessAction extends ActionSupport { // 变量名必须和select的name属性完全一致 private String someSelectName; // 处理后返回给前端的结果变量 private String processResult; @Override public String execute() { // 这里写你的业务处理逻辑,someSelectName就是下拉框选中的值 if ("option1_value".equals(someSelectName)) { processResult = "选中了第一项,处理完成"; } else if ("option2_value".equals(someSelectName)) { processResult = "选中了第二项,处理完成"; } return SUCCESS; } // 必须生成getter和setter public String getSomeSelectName() { return someSelectName; } public void setSomeSelectName(String someSelectName) { this.someSelectName = someSelectName; } public String getProcessResult() { return processResult; } public void setProcessResult(String processResult) { this.processResult = processResult; } }
3. 配置struts.xml
配置Action映射,指定返回视图类型为velocity,关联你对应的vm模板:
<struts> <package name="default" extends="struts-default"> <!-- action的name和表单里的action属性对应,class填你自己的Action类全路径 --> <action name="someFormAction" class="com.yourpackage.SelectProcessAction"> <!-- 结果类型指定为velocity,标签内容填你的vm文件路径 --> <result name="success" type="velocity">/path/to/your/template.vm</result> <!-- 如果是异步提交不需要返回页面,可以返回纯文本结果 --> <!-- <result name="success" type="plainText">${processResult}</result> --> </action> </package> </struts>
依赖说明(Maven项目)
确保你的pom.xml中已经引入Struts2的Velocity插件依赖:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-velocity-plugin</artifactId> <version>你的Struts2对应版本号</version> </dependency>
内容的提问来源于stack exchange,提问作者Benny B
相关产品推荐
相关产品推荐

