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

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

一.Action调用

  1.通过表单调用

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

input author's name:

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


            /WEB-INF/content/authorsearchresult.jsp
            /WEB-INF/content/error.jsp

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

  2.通过超链接调用

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

${l.title }
 
  

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


            /WEB-INF/content/details.jsp
            /WEB-INF/content/error.jsp


  显然,使用超链接时我们使用了相对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方法以及前端的参数名是否与后台的变量名匹配。

你可能感兴趣的:(Struts2)