Struts2调用Action的两种方法以及参数处理

本文介绍Struts2框架下Action的两种调用方式:表单调用和超链接调用,并详细解析了如何通过表单和超链接传递参数到后台,以及Struts2框架是如何自动进行参数赋值的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在Struts2的框架下,Action的配置信息写在struts.xml中,用来处理来自页面的请求。

一.Action调用

  1.通过表单调用

    表单调用是最为常见的调用方法,只要搞清表单与Action之间的对应方法即可完成调用:

<form action="authorsearch" method="get">
	input author's name:<input type="text" name="author.authorname">
	<input type="submit" value="search">
</form>

    这是一个简单的表单,其中action属性即可说明该表单所对应的action,在struts.xml中只要有如下配置即可完成调用:

<action name="authorsearch" class="lab2.AuthorSearch">
            <result name="success">/WEB-INF/content/authorsearchresult.jsp</result>
            <result name="error">/WEB-INF/content/error.jsp</result>
</action>

    很明显,action的name属性必须要和表单中的action属性一致。

  2.通过超链接调用

  如果想实现点击某个文字或图片后在后台执行Java代码,就要使用超链接调用Action:

<td><a href="./showdetails.action?bookname.title=${l.title}">${l.title }</a></td>

  其中showdetails为struts.xml下的另一Action:

<action name="showdetails" class="lab2.ShowDetails">
            <result name="success">/WEB-INF/content/details.jsp</result>
            <result name="error">/WEB-INF/content/error.jsp</result>
</action>


  显然,使用超链接时我们使用了相对URL,以上代码中的"./showdetails.action"即为相对URL。要注意的是,使用这种方法是必须明确struts.xml中Action所在package的namespace属性,这里我的设置为"/",即项目根文件夹,如果是其他目录,还需要在"/XX.action"前加上该目录。

二.参数处理

  注意观察上面的表单和超链接,便能发现author.authorname以及bookname.title这样的变量,它们的作用是向后台的Java代码传递参数。在表单的例子中,author.authorname的值为用户输入,而超链接中的"${l.title }"为jsp的EL表达式,这些都是需要交给后台处理的参数,需要通过Action传送到后台,下面用表单的例子说明。

  在后台对应第一个Action的类为AuthorSearch,代码如下:

public class AuthorSearch implements Action {

	private Author author;
	
	@Override
	public String execute() throws Exception {
		//do something
		return null;
	}
}



  Author的定义如下:

public class Author {
	private int authorid;
	private String authorname;
	private String age;
	private String country;
		
	public int getAuthorid() {
		return authorid;
	}

	public void setAuthorid(int authorid) {
		this.authorid = authorid;
	}

	public String getAuthorname() {
		return authorname;
	}

	public void setAuthorname(String authorname) {
		this.authorname = authorname;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}
}

  在代码运行时,Struts2框架会“自动”为author.authorname赋值,其值为表单中用户所输入的内容,这是如何实现的呢?原来在底层,Struts2框架是这样实现的:
  1.调用request.getParameterNames()方法获取所有的参数名。我们在JavaEE的API文档中可以看到这个方法的描述:

 

  2.对以上方法返回的每个String执行Action.getMethod("set" + String的首字母大写)。例如上面举例的表单中我们的参数名为author.authorname,执行后所调用的method为author.setAuthorname(),而在Author类中,该方法正是authorname的setter方法,由此便完成了对author.authorname的赋值。

  所以,当出现Error setting expression 'author.authorname' with value ['XXX', ]的错误时,我们就要检查是否为authorname设置了符合要求的setter方法以及前端的参数名是否与后台的变量名匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值