小尾巴
在上一篇中,有一个历史遗留问题,就是关于Struts2中使用post和get模式,post模式可以解决中文乱码问题,是因为Struts2中的默认编码格式就是utf-8的。
打开之后我们可以看到这个属性:
在下图中是Struts2核心jar包中的常量默认值
struts.i18n.encoding=UTF-8
复制代码
在这里,Struts2就将默认编码格式设置为了utf-8,注意,这里是指针对post提交方式;然后我们回顾下get方法和post方法:
- get是从服务器上获取数据,post是向服务器传送数据。
- 在客户端, get方式在通过URL提交数据,数据在URL中可以看到;post方式,数据放置在HTML HEADER内提交
- 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
- get方式提交的数据最多只能有1024字节,而post则没有此限制
- 安全性问题。正如在2中提到,使用get的时候,参数会显示在地址栏上,而 post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get ;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好
那如果我们jsp页面设置了编码格式是GBK的情况下,我们使用post也是会出现乱码,这是因为两者不匹配,当我们使用get时候,由于程序员(也就是我们)没有针对他进行设置编码格式,所以就会出现乱码
进阶篇开始--struts2的三种传值方式
三种方式分别是:
- 直接在action中写属性(值模型)
- 单独建立新的对象类,在action中进行声明(域模型)
- 模型驱动,action继承ActionSupport 实现ModelDriven
值模型就是上篇的进阶篇;
域模型如下
老规矩新建项目,这里就不多赘述了,老样子,注意勾选生成web.xml就可以了,然后配置web.xml文件,编写jsp前台文件,这次我们使用jstlb标签来写,关键代码如下:
index.jsp这里作为登录页
导入库文件:
<%@ taglib prefix="s" uri="/struts-tags" %>
复制代码
设计控件:
<s:form action="login" method="post">
<s:textfield name="user1.uname" label="用户名"></s:textfield>
<s:textfield name="user1.pwd" label="密码"></s:textfield>
<tr>
<td><s:submit type="simple" value="提交"></s:submit></td>
<td><s:reset type="simple" value="重置"></s:reset></td>
</tr>
</s:form>
复制代码
show.jsp这里作为登录成功页
hello,${user.uname }
复制代码
配置struts2.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<include file="hello.xml"/>
</struts>
复制代码
这里主要说一下这个相当于jsp中的include,用来便于开发。
配置hello.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="login" />
<action name="login" class="com.huaruan.action.UserAction">
<result name="success">show.jsp</result>
<result name="input" type="redirect">index.jsp</result>
</action>
</package>
</struts>
复制代码
在xml文件中,所有的package必须继承自struts-default这个类,这是Struts2的特点
编写UserAction类
public class UserAction extends ActionSupport{
private User user1;
public User getUser1() {
return user1;
}
public void setUser1(User user1) {
this.user1 = user1;
}
public String execute() {
String result = null;
if("Chuxus".equals(user1.getUname())&&"123".equals(user1.getPwd())) {
result=SUCCESS;
}else {
result = INPUT;
}
return result;
}
复制代码
这里是将值模式的get和set方法抽离出去,然后在action类里面创建一个User类型私有变量,并为他做一个set&get方法,剩下的与之前无异。主要的一点是jsp页面中的细节:
- 两个控件的name值:分别使用的是我们在action类里面新建的变量user1然后.user(具体的属性),这里务必注意!
最后编写User类
public class User {
private String uname;
private String pwd;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
复制代码
这样就完成了使用域模式来传值
模型驱动如下:
准备步骤和上面基本一致,下面主要介绍不同点
- action类中,不再提供User类型变量的get&set方法,直接进行实例化,这是区别之一
- action类实现ModelDriven接口
- 类里面不再需要execute()方法,这里必须去掉,增加自己的方法
- 在jsp页面的form表单中,action属性值由UserAction变为 UserAction![你的方法名]
- 在struts.xml中修改为
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
复制代码
这样,我们就完成了三种不同模式传值的探索,如果您有什么问题,可以在下面留言哦!