struts 中form 表单理解

本文探讨了Struts框架中表单与Action之间的交互原理。详细解释了客户端如何通过不同形式的输入元素(如input标签和Struts标签)向服务器发送请求,以及服务器端Action如何处理这些请求并将数据映射到相应的表单对象上。
1、action 相应请求 返回到客户端浏览器
jsp 页面中元素的形式 :
1、input (html元素)
2、struts标签 (struts元素)

struts 标签中的 name = "是你在struts-config 配置好的form表单" ,property ="是配置好表单中的属性值" ,如果你填写property 在表单中不存在就会报notfound 错误。
因为服务器会解析jsp页面代码,把struts标签 转换成 html识别的 input,property会解析成input 中的 name 值,如果没有在 from 表单中发现该名字,就会出错。
input 存Html 代码,它的 name 是可以 自己制定的,与struts无关,所以可以任意设定。它的值取决 它的value 。
此时页面中存在的没有struts标签,只有input。

2、由客户端发送请求到 action
action 可以是之前进来的,也可以是其他的。
是之前的,两个form相同,没有什么问题。
是其他的,两个form配置的不同,会是什么样的呢?
提交表单后,页面所有的元素(例如 input)都会传给服务器,当通过action时候要封装配置的form,由页面来的 元素会自动去和 该form匹配,名字一样的会自动赋值过去,不一样的就不会赋值。不用担心form不匹配所有的元素会报错,同时这么值还会存在request中,可以通过parameter获取。

例如就有这样的

<action path="/vacancyList"
type="com.VacancyGridAction"
name="[color=red]vacancyGridForm[/color]" scope="request">
<forward name="vacancyList" path="vacancyList" />
</action>

|
\ /

<td ><input type="checkbox" name="aaaa" value=""/></td>
<td ><bean:write name="vacancyGridForm" property="standardSalePrice" /></td>
页面不会因为checkbox 的名字aaa 不存在vacancyGridForm中而出错
|
\ / 提交
<action path="[color=red]/vacancyView[/color]"
type="comVacancyAction"
name="[color=red]vacancyForm[/color]" scope="request">
<forward name="vacancyView" path="vacancyView" />
</action>

不会因为vacancyForm不存在standardSalePrice,aaaa而报错,他们存在只会自动匹配,不存在不赋值罢了。

而可以用 request.getParameter("aaaa");
request.getParameter("standardSalePrice"); 获取
Struts 框架中,统一配置请求头以处理表单提交通常可以通过拦截器(Interceptor)实现。Struts2 提供了强大的拦截器机制,可以用于在请求处理前后执行通用逻辑,包括设置请求头信息。 ### 使用拦截器设置统一请求头 在 `struts.xml` 中定义一个自定义拦截器,并将其应用到所有相关的 Action 上,从而实现统一的请求头设置。 #### 示例:自定义拦截器设置请求头 1. **创建自定义拦截器类** ```java package com.gt.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; public class RequestHeaderInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); // 获取请求头中的特定信息,或者统一设置请求头 String contentType = request.getContentType(); if (contentType == null || contentType.isEmpty()) { // 可以在这里记录日志或抛出自定义异常 return "error"; // 返回错误结果 } // 继续执行 Action return invocation.invoke(); } } ``` 2. **在 `struts.xml` 中注册拦截器** ```xml <struts> <package name="default" namespace="/" extends="struts-default"> <!-- 注册拦截器 --> <interceptors> <interceptor name="requestHeaderInterceptor" class="com.gt.interceptor.RequestHeaderInterceptor"/> <!-- 定义默认的拦截器栈 --> <interceptor-stack name="appDefaultStack"> <interceptor-ref name="requestHeaderInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <!-- 设置默认拦截器栈 --> <default-interceptor-ref name="appDefaultStack"/> <!-- 示例 Action --> <action name="login" class="com.gt.web.action.LoginAction"> <result name="success">/WEB-INF/mainFrame.jsp</result> <result name="error">/WEB-INF/login.jsp</result> </action> </package> </struts> ``` 3. **在 `struts-config.xml` 中配置(适用于 Struts 1.x)** 对于 Struts 1.x,可以通过自定义 `ActionServlet` 或使用 `RequestProcessor` 来统一处理请求头信息。例如: ```java public class CustomRequestProcessor extends RequestProcessor { @Override protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) { // 在这里统一处理请求头 String contentType = request.getContentType(); if (contentType == null || !contentType.contains("application/x-www-form-urlencoded")) { // 可以记录日志或返回错误页面 return false; } return super.processPreprocess(request, response); } } ``` 然后在 `struts-config.xml` 中配置: ```xml <controller processorClass="com.gt.web.processor.CustomRequestProcessor"/> ``` ### 请求头处理的注意事项 - **拦截器顺序**:确保自定义拦截器在 `defaultStack` 之前执行,以便在请求处理前完成请求头的检查或设置。 - **兼容性**:在 Struts 1.x 和 Struts 2.x 中,拦截机制不同,需根据实际框架版本选择合适的实现方式。 - **安全性**:可以在拦截器中加入对请求头的校验逻辑,防止非法请求。 ### 相关问题 1. Struts2 拦截器如何实现请求头的统一日志记录? 2. 如何在 Struts1.x 中使用 `RequestProcessor` 处理请求头? 3. Struts 框架中如何通过拦截器防止 CSRF 攻击? 4. 在 Struts2 中如何动态修改请求头内容? 5. 自定义拦截器与 Struts 默认拦截器栈的优先级如何配置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值