在struts2中实现一个表单中提交多个请求的例子,常见的方法是使用多个提交按钮,每个按钮对应一个请求。以下是详细的步骤:
1. 编写表单
首先在jsp页面中编写表单,并使用<s:submit>
标签来生成提交按钮。每个不同的提交按钮会绑定不同的请求。例如:
<s:form action="processForm">
<!-- 表单输入框等元素 -->
<s:submit name="submitType" value="Save"/>
<s:submit name="submitType" value="Update"/>
</s:form>
上述表单中有两个提交按钮,它们的name
属性都为submitType
,但是它们的value
属性分别为Save
和Update
。这意味着在提交表单时,会根据按钮的value
属性来判断用户到底选择了哪个按钮。这个值会被作为请求参数带到processForm
这个action中。
2. 编写Action
在struts2中,可以在Action中使用@Action
注解来指定这个Action对应的请求路径。同时可以使用@Result
注解来指定请求成功后需要转到哪个页面。
在本例中,需要处理两个不同的请求,所以需要在Action中编写两个方法,分别对应这两个请求。例如:
@Action(value = "processForm", results = {
@Result(name = "save", location = "/success-save.jsp"),
@Result(name = "update", location = "/success-update.jsp")
})
public String processForm() {
String submitType = getSubmitType();
if (submitType.equals("Save")) {
// 处理Save请求的代码
return "save";
} else if (submitType.equals("Update")) {
// 处理Update请求的代码
return "update";
} else {
return ERROR;
}
}
// 使用@SkipValidation注解可以跳过表单校验
@Action(value = "cancelForm", results = {@Result(name = "success", location = "/cancel.jsp")})
@SkipValidation
public String cancelForm() {
// 处理Cancel请求的代码
return SUCCESS;
}
上述代码中,processForm
方法对应表单的提交请求,根据提交按钮的值来判断需要执行哪个处理逻辑,然后返回对应的结果页面。cancelForm
方法对应另外一个请求,它的@SkipValidation
注解可以跳过表单校验。
3. 编写验证器
如果需要对表单进行约束和校验,还需要配置struts2的表单验证器。在本例中,可以使用@Validations
注解来指定需要的校验规则。
例如,以下代码指定了一个名为processForm
的校验规则,它要求必须有一个名为username
的非空字符串。
@Validations(
requiredStrings = {@RequiredStringValidator(fieldName = "username", message = "Username is required")}
)
示例1:增删改示例
下面给出一个完整的增删改的示例,使用struts2中一个表单中提交多个请求的方式实现。假设有一个用户管理的应用,可以通过表单来新增、修改或者删除用户。
- JSP页面
创建一个包含三个提交按钮的JSP页面:
<s:form action="processForm">
<s:textfield name="username" label="Username"/>
<s:textfield name="password" label="Password"/>
<s:textfield name="email" label="Email"/>
<s:submit name="submitType" value="Create"/>
<s:submit name="submitType" value="Update"/>
<s:submit name="submitType" value="Delete"/>
</s:form>
- Action
在Action中定义三个方法,分别对应Create、Update和Delete请求:
@Action(value = "processForm", results = {
@Result(name = "success-create", location = "/success-create.jsp"),
@Result(name = "success-update", location = "/success-update.jsp"),
@Result(name = "success-delete", location = "/success-delete.jsp")
})
public String processForm() {
String submitType = getSubmitType();
if (submitType.equals("Create")) {
// 处理创建用户的逻辑
return "success-create";
} else if (submitType.equals("Update")) {
// 处理更新用户的逻辑
return "success-update";
} else if (submitType.equals("Delete")) {
// 处理删除用户的逻辑
return "success-delete";
} else {
return ERROR;
}
}
- 验证器
定义一个Validations注解,要求表单的username字段和password字段必须有值:
@Validations(
requiredStrings = {
@RequiredStringValidator(fieldName = "username", message = "Username is required"),
@RequiredStringValidator(fieldName = "password", message = "Password is required")
}
)
通过以上配置,当用户点击不同的提交按钮时,struts2框架会将请求参数中的submitType
值传递到前端控制器中,根据不同的值会转向到相应的方法中,最终实现三个不同的用户处理逻辑。
示例2:多语言切换
假设我们的应用需要支持多国语言,通过表单提交不同的语言选择来进行切换。
- JSP页面
创建一个带有三个提交按钮的表单页面:
<s:form action="changeLanguage">
<s:submit name="submitType" value="English"/>
<s:submit name="submitType" value="Chinese"/>
<s:submit name="submitType" value="Spanish"/>
</s:form>
- Action
在Action中定义一个方法,判断请求是哪个按钮被点击,然后根据点击的按钮选择对应的语言,存储到ActionContext中:
@Action(value = "changeLanguage", results = {@Result(name = "success", location = "/index.jsp")})
public String changeLanguage() {
String submitType = getSubmitType();
String language;
if (submitType.equals("English")) {
language = "en_US";
} else if (submitType.equals("Chinese")) {
language = "zh_CN";
} else if (submitType.equals("Spanish")) {
language = "es_ES";
} else {
language = "en_US";
}
ActionContext.getContext().setLocale(new Locale(language));
return SUCCESS;
}
- 配置文件
在struts.xml文件中,需要增加如下代码,指定默认的语言设置:
<constant name="struts.locale" value="en_US"/>
通过以上配置,在点击按钮后,struts2框架会根据请求参数中的submitType
值转到相应的方法中,然后根据按钮的值选择对应的语言,存储到ActionContext中,最终实现多语言切换的功能。
以上两个示例都说明了如何在struts2中实现一个表单中提交多个请求的例子,如何根据请求参数中的按钮值,转到相应的处理方法中,以及如何根据不同的请求返回不同的结果页面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2中一个表单中提交多个请求的例子(多个提交按钮) - Python技术站