Struts2学习笔记(5)-参数传递方法
参数传递即将参数传输到程序后台中,后台可能做一些处理,然后再将内容存入数据库之类嗒!
参数传递的方法较多,一一说明如下。
1、Action中直接参数法
有如下的index.jsp文件
<?xmlversion="1.0"encoding="GB18030"?> <%@pagelanguage="java"contentType="text/html;charset=GB18030" pageEncoding="GB18030"%> <% Stringpath=request.getContextPath(); StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=GB18030"/> <basehref="<%=basePath%>"/> <title>Inserttitlehere</title> </head> <body> 使用action属性接收参数<ahref="user/user!add?name=a&age=8">添加用户</a> </body> </html>
对于其中的<a></a>来说,传递两个参数至程序,一个是name,一个是age,在struts.xml中的配置如下:
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEstrutsPUBLIC "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constantname="struts.devMode"value="true"/> <packagename="user"extends="struts-default"namespace="/user"> <actionname="user"class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package> </struts>
这时我们的UserAction该如何写呢?范例如下:
packagecom.bjsxt.struts2.user.action; importcom.opensymphony.xwork2.ActionSupport; publicclassUserActionextendsActionSupport{ privateStringname; privateintage; publicStringadd(){ System.out.println("name="+name); System.out.println("age="+age); returnSUCCESS; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } }
很简单,就是定义了两个属性,注:这两个属性的set和get方法必须要写,可以使用eclipse的快速生成方式,非常简单。这样上述程序在运行时就会打印出所要的结果
name=a和age=8。
有说明如下:第一,struts2会自动进行参数传递,这个过程无需我们参与;第二,struts传递参数时针对的是set和get方法,而不是name和age属性,也就是说,假如我们修改其中的name为其他名称,如username,但是方法仍然是setName和getName的话,对于整个功能的实现来说没有任何区别,只是有点别扭而已;第三,也是最重要的一点,就是假如有很多的属性,这样的话我们就需要非常多的set和get方法,这是非常不方便的,因此引伸出了下面这种方式。
2、Action添加类对象法
这个时候我们1中的属性都归于一个类中,如User
packagecom.bjsxt.struts2.user.model; publicclassUser{ privateStringname; privateintage; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } }
这样在Action类中的写法就变得简单了很多
packagecom.bjsxt.struts2.user.action; importcom.bjsxt.struts2.user.model.User; importcom.opensymphony.xwork2.ActionSupport; publicclassUserActionextendsActionSupport{ privateUseruser; publicStringadd(){ System.out.println("name="+user.getName()); System.out.println("age="+user.getAge()); returnSUCCESS; } publicUsergetUser(){ returnuser; } publicvoidsetUser(Useruser){ this.user=user; } }
注:此时我们不需要自己手动生成一个User对象,这个过程是由Struts2自动完成的。
并且此时的url也需要作下修改,即index中的<a></a>标签作下修改:
<?xmlversion="1.0"encoding="GB18030"?> <%@pagelanguage="java"contentType="text/html;charset=GB18030" pageEncoding="GB18030"%> <% Stringpath=request.getContextPath(); StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=GB18030"/> <basehref="<%=basePath%>"/> <title>Inserttitlehere</title> </head> <body> 使用DomainModel接收参数<ahref="user/user!add?user.name=a&user.age=8">添加用户</a> </body> </html>
修改成上述18行部分。
上面说明了下Struts2参数传递的两种方法,其中第二种方法被称为:DomainModel,域模型。即新建一个类,用于存放属性。
下面说明另外一种方法,被称为:ModelDriven,模型驱动。
它与第二种方法非常类似,其他都是一样的,仅仅就是Action和访问有区别,它的Action如下:
packagecom.bjsxt.struts2.user.action; importcom.bjsxt.struts2.user.model.User; importcom.opensymphony.xwork2.ActionSupport; importcom.opensymphony.xwork2.ModelDriven; publicclassUserActionextendsActionSupportimplementsModelDriven<User>{ privateUseruser=newUser(); publicStringadd(){ System.out.println("name="+user.getName()); System.out.println("age="+user.getAge()); returnSUCCESS; } @Override publicUsergetModel(){ returnuser; } }
我们可以从中看到,它实现了ModelDriven接口,并采用了泛型技术。采用这种方式Struts2不会自动的实例化一个对象,因此只能我们手动生成。它覆写了ModelDriven接口的getModel()方法,它的作用就是返回一个类对象。
它的访问是和第二种有区别的(与第一种方法一样):
使用ModelDriven接收参数<ahref="user/user!add?name=a&age=8">添加用户</a>
它并没有采用user.name的方式,这也是为什么必须要new一个对象的原因。
这种方式的基本思想过程为:首先Action解析url,获得其中的参数,然后进入Action中,发现此Action实现了一个ModelDriven接口,此时就调用ModelDriven接口的getModel方法,获得类的对象,然后调用此类的set和get方法,将参数传入。
此种方式体现了Struts2的MVC思想,M----Model,V----View,C----Controller,但是这种方式很少使用,我们使用最多的还是上面的第二种方式。
以上就是Struts2中参数传递方法的全部内容,希望能给大家一个参考,也希望大家多多支持毛票票。