您的位置:首页 > 编程语言 > Java开发

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

2016-10-02 01:19 351 查看
  在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方法以及前端的参数名是否与后台的变量名匹配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0
相关文章推荐