Struct2 向Action中传递参数(中文乱码问题)

时间:2024-01-02 20:29:19

就是把视图上的值传递到Action定义的方法中

也就是把数据从前台传递到后台

三种方式:

  • 1.  使用action属性接收参数

比如jsp页面:

<body>
使用action属性接收参数<a href="user/user!add?name=a&age=8">添加用户</a> </body>

对应的struct.xml

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>

那么在UserAction类中,要定义两个属性(与url中的参数一样)

Struct2 向Action中传递参数(中文乱码问题)

必须有两个特别重要的方法(getXX和setXX,这个XX一定要与url中的参数一致)

  • 2.使用DomainModel (域模型,项目中真正存在的实体概念)

就是说如果传递过来的参数特别多,那么可以把这些参数顶一个成一个域模型

比如先定义一个Person类,里面有一些属性,然后再定义

Struct2 向Action中传递参数(中文乱码问题)

<body>
使用Domain Model接收参数<a href="user/user!add?user.name=a&user.age=8">添加用户</a> </body>

这里面Struct自动实现了User类的new操作以及get和set的调用

不用太纠结这个赋值过程是怎么样的,这些都是struct背后的机制,这样设置之后,就可以在类中得到两个属性的值

但是有一种情况,比如说注册的时候,会有一个确认密码的字段,要传到后台,但是在我们定义的DomainModel 里是不会有这个字段的。

就是

当从前段传递过来的字段与一个DomainModel 不匹配时,

使用DTO(数据传输对象)

在上例中,就是UserDTO类,包含传递过来的所有字段,接收数据之后,再create一个user类出来,然后存到数据库中。

简单说,DTO就是一个接收数据并传递的过程

Struct2 向Action中传递参数(中文乱码问题)

  • 3.用ModelDriven接收参数(模型驱动)

很少用,但是包含一个很重要的思想

当struct接收到一个请求或者模型之后,这个请求过程往往是交给后面的模型处理,而不会自己处理 -- MVC

其中像UserAction一样各种各样的Action都是 C

像其中 定义的 User 是M

像add方法返回值 是  C

Struct2 向Action中传递参数(中文乱码问题)

<body>
使用ModelDriven接收参数<a href="user/user!add?name=a&age=8">添加用户</a> </body>

ModelDriven使得它认为定义的User是一个类

它里面有一个方法 getModel

Struct2 向Action中传递参数(中文乱码问题)

如果传递参数有中文怎么办?

<body>
使用action属性接收参数,测试中文问题
<form action="user/user!add" method="post">
姓名:<input type="text" name="name"></input>
<input type="submit" value="submit"/>
</form>
</body>

解决办法:

Struct加 上constant常量配置

Struct2 向Action中传递参数(中文乱码问题)

同时说明一下constant的所有配置都在哪里可以找得到

1. 去官网查文档

2. 所有的配置都在这里

Struct2 向Action中传递参数(中文乱码问题)

可以看到这一行

### This can be used to set your default locale and encoding scheme
# struts.locale=en_US
struts.i18n.encoding=UTF-8

也就是structs默认是UTF-8;

我们要把它改成GBK即可