Struts2学习之路(二)

小尾巴

   在上一篇中,有一个历史遗留问题,就是关于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" />
复制代码

这样,我们就完成了三种不同模式传值的探索,如果您有什么问题,可以在下面留言哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值