Struts2学习笔记(5)-参数传递方法

 更新时间:2016年06月12日 11:53:57   作者:meaijojo  
本文主要介绍Struts2中参数传递方法,希望能给大家做一个参考。

参数传递即将参数传输到程序后台中,后台可能做一些处理,然后再将内容存入数据库之类嗒!

参数传递的方法较多,一一说明如下。

1、Action中直接参数法

有如下的index.jsp文件

复制代码 代码如下:
<?xml version="1.0" encoding="GB18030" ?> 
<%@ page language="java" contentType="text/html; charset=GB18030" 
    pageEncoding="GB18030"%> 
 
<%  
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> 
<base href="<%=basePath %>"/> 
<title>Insert title here</title> 
</head> 
<body> 
使用action属性接收参数<a href="user/user!add?name=a&age=8">添加用户</a> 
     
</body> 
</html>

对于其中的<a></a>来说,传递两个参数至程序,一个是name,一个是age,在struts.xml中的配置如下:

复制代码 代码如下:
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
 
<struts> 
    <constant name="struts.devMode" value="true" /> 
    <package name="user" extends="struts-default" namespace="/user"> 
         
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> 
            <result>/user_add_success.jsp</result> 
        </action> 
    </package> 
</struts>

这时我们的UserAction该如何写呢?范例如下:

复制代码 代码如下:
package com.bjsxt.struts2.user.action; 
 
import com.opensymphony.xwork2.ActionSupport; 
 
public class UserAction extends ActionSupport { 
     
    private String name; 
    private int age; 
     
    public String add() { 
        System.out.println("name=" + name); 
        System.out.println("age=" + age); 
        return SUCCESS; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public int getAge() { 
        return age; 
    } 
 
    public void setAge(int age) { 
        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

复制代码 代码如下:
package com.bjsxt.struts2.user.model; 
 
public class User { 
    private String name; 
    private int age; 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public int getAge() { 
        return age; 
    } 
    public void setAge(int age) { 
        this.age = age; 
    } 
}

这样在Action类中的写法就变得简单了很多

复制代码 代码如下:
package com.bjsxt.struts2.user.action; 
 
import com.bjsxt.struts2.user.model.User; 
import com.opensymphony.xwork2.ActionSupport; 
 
public class UserAction extends ActionSupport { 
     
    private User user; 
 
    public String add() { 
        System.out.println("name=" + user.getName()); 
        System.out.println("age=" + user.getAge()); 
        return SUCCESS; 
    } 
 
    public User getUser() { 
        return user; 
    } 
 
    public void setUser(User user) { 
        this.user = user; 
    } 
     
}

注:此时我们不需要自己手动生成一个User对象,这个过程是由Struts2自动完成的。

并且此时的url也需要作下修改,即index中的<a></a>标签作下修改:

复制代码 代码如下:
<?xml version="1.0" encoding="GB18030" ?> 
<%@ page language="java" contentType="text/html; charset=GB18030" 
    pageEncoding="GB18030"%> 
 
<%  
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> 
<base href="<%=basePath %>"/> 
<title>Insert title here</title> 
</head> 
<body>  
使用Domain Model接收参数<a href="user/user!add?user.name=a&user.age=8">添加用户</a> 
     
</body> 
</html>

修改成上述18行部分。

上面说明了下Struts2参数传递的两种方法,其中第二种方法被称为:DomainModel,域模型。即新建一个类,用于存放属性。

下面说明另外一种方法,被称为:ModelDriven,模型驱动。

它与第二种方法非常类似,其他都是一样的,仅仅就是Action和访问有区别,它的Action如下:

复制代码 代码如下:
package com.bjsxt.struts2.user.action; 
 
import com.bjsxt.struts2.user.model.User; 
import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.ModelDriven; 
 
public class UserAction extends ActionSupport implements ModelDriven<User>{ 
     
    private User user = new User(); 
     
    public String add() { 
        System.out.println("name=" + user.getName()); 
        System.out.println("age=" + user.getAge()); 
        return SUCCESS; 
    } 
 
    @Override 
    public User getModel() { 
        return user; 
    } 
     

我们可以从中看到,它实现了ModelDriven接口,并采用了泛型技术。采用这种方式Struts2不会自动的实例化一个对象,因此只能我们手动生成。它覆写了ModelDriven接口的getModel()方法,它的作用就是返回一个类对象。

它的访问是和第二种有区别的(与第一种方法一样):

复制代码 代码如下:
使用ModelDriven接收参数<a href="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中参数传递方法的全部内容,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 9中List.of()的使用示例及注意事项

    Java 9中List.of()的使用示例及注意事项

    Java 9引入了一个新的静态工厂方法List.of(),用于创建不可变的列表对象,这篇文章主要介绍了Java 9中List.of()的使用示例及注意事项的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • java实现图形化界面计算器

    java实现图形化界面计算器

    这篇文章主要为大家详细介绍了java实现图形化界面计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Java数据结构中七种排序算法实现详解

    Java数据结构中七种排序算法实现详解

    这篇文章主要介绍了Java数据结构中七种排序算法的实现方法,排序算法可分为两大类,比较类排序和非比较类排序,顾名思义可知它们是通过比较来决定元素间的相对次序,需要详细了解排序算法的朋友可以参考下
    2024-02-02
  • Java中synchronized关键字的使用和原理详解

    Java中synchronized关键字的使用和原理详解

    这篇文章主要介绍了Java中synchronized关键字的使用和原理详解,JVM 是通过进入、退出 对象监视器(Monitor)来实现对方法、同步块的同步的,而对象监视器的本质依赖于底层操作系统的互斥锁实现,需要的朋友可以参考下
    2023-09-09
  • 解决IDEA开发工具右侧没有Maven工具栏的问题

    解决IDEA开发工具右侧没有Maven工具栏的问题

    这篇文章主要给大家解决了IDEA开发工具右侧没有Maven工具栏的问题,文中有详细的解决步骤,如果有遇到一样问题的小伙伴,可以参考阅读本文
    2023-09-09
  • Java实现Linux下双守护进程

    Java实现Linux下双守护进程

    这篇文章主要介绍了Java实现Linux下双守护进程的思路、原理以及具体实现方式,非常的详细,希望对大家有所帮助
    2014-10-10
  • Java中实现接口限流的方案详解

    Java中实现接口限流的方案详解

    常用的接口限流方案就是计数器限流方案、时间窗口限流方案和令牌桶限流方案等,这些方案的概念大致也知道,但是实际上也没有实现过,所以本文就来自动动手实践一下吧
    2023-05-05
  • 理解Java注解及Spring的@Autowired是如何实现的

    理解Java注解及Spring的@Autowired是如何实现的

    今天通过本文带领大家学习注解的基础知识,学习Spring的@Autowired是怎么实现的,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • maven加载依赖报错的原因分析及解决方法

    maven加载依赖报错的原因分析及解决方法

    通常我们在项目中引入第三方依赖包时,为了避免其版本迭代问题,经常会使用本地的包,这篇文章主要给大家介绍了关于maven加载依赖报错的原因分析及解决方法的相关资料,需要的朋友可以参考下
    2023-10-10
  • flink RichFunction之坑及解决

    flink RichFunction之坑及解决

    这篇文章主要介绍了flink RichFunction之坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论