Struts2中参数传值的3种情况
1.请求参数绑定到Action的实例字段上
2.Action将值传递到转发的视图上
3.Action将值传递到重定向的视图上
一、请求参数绑定到Action的实例字段上以及Action将值传递到转发的视图上
Struts可以自动将请求URL中的请求参数或者表单提交的参数绑定到Action定义的实例字段上,绑定的规则使用ognl表达式语言。OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。关于OGNL,在下一篇详细介绍 。
以表单提交为例
1.addUser.jsp
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style type="text/css"> input { display: block; } </style> </head> <body> <!--提交的表单,user.id和user.name作为请求参数传递到了服务器端--> <form action="/user/hellons/hi" method="post"> <input type="text" id="userId" name="user.id"/> <input type="text" id="userName" name="user.name"/> <input type="submit"/> </form> </body> </html>
2. struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hellopkg" namespace="/hellons" extends="struts-default"> <action name="hi" class="com.tom.actions.HelloWorldAction"> <!--页面内跳转--> <result name="dispatcher" type="dispatcher">/htmls/result.jsp</result> </action> </package> </struts>
3. HelloWorldAction
package com.tom.actions; import com.tom.model.User; public class HelloWorldAction { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute() { System.out.println(user.getId() + "\t" + user.getName()); return "dispatcher"; } }
4. result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title></title> </head> <body> The information is: ${user.id}, ${user.name} </body> </html>
结论:
1. 在表单中输入100和abc,提交表单后,控制台输出100和abc,同时页面也显示The information is: 100, abc,原因是浏览器客户端提交的表单(GET请求则将参数添加到URL中,POST请求则以请求数据流的方式传输到服务器端,与action中的实例字段(通过setter方法反射)进行参数绑定。
2. 将action请求转发到result.jsp时,Struts通过调用action的字段的getter方法将action中字段的值替换result.jsp中的JSTL表达式的值
3. 在浏览器客户端提交的user.id为100,这是一个字符串,在action中,自动完成了字符串到整型数的转化,这是Struts完成的自动类型转换,Struts支持自定义类型转换
4.在通过POST提交表单的方式时,浏览器自动为请求添加了
Content-Type: ContentTypeapplication/x-www-form-urlencoded ,通过这个内容类型是告诉web服务器,POST的请求数据是通过表单提交的,这些数据将作为请求参数,然后web容器自动将POST中的请求取出,然后将这些请求参数设置
到HttpServletRequest中,可以通过getParameter等方法获取这些请求参数
二、Action将值传递到重定向的视图上
1. struts.xml文件
<struts> <package name="hellopkg" namespace="/hellons" extends="struts-default"> <action name="hi" class="com.tom.actions.HelloWorldAction"> <!--定义跳转类型为重定向,并且将Action中user.id和user.name作为url参数传递到result.jsp中--> <result name="redirect" type="redirect">/htmls/result.jsp?id=${user.id}&name=${user.name}</result> </action> </package> </struts>
2.HelloWorldAction的execute方法
public String execute() { System.out.println(user.getId() + "\t" + user.getName()); //重定向到结果视图 return "redirect"; }
3.result.jsp
<body> <!--param表示从url中获取请求参数--> The information is: ${param.id}, ${param.name} </body>
结论:
1.当用户通过POST请求提交表单,HelloWorldAction将获得用户在表单中输入的信息,user.id=100,user.name=abc
2.Action在重定向时,Struts将Action中的值传道重定向视图的URL上,
<result name="redirect" type="redirect">/htmls/result.jsp?id=${user.id}&name=${user.name}</result>
3.所以用户提交后,将看到页面重定向到http://localhost:8668/user/htmls/result.jsp?id=200&name=abc
问题:
假如重定向视图如下配置,即参数的key分别是user.id和user.name,
<result name="redirect" type="redirect">/htmls/result.jsp?id=${user.id}&user.name=${user.name}</result>
那么在result.jsp中,通过如下方式得不到值,在这种情况下如何传值呢?
${param.user.id}, ${param.user.name}