struts2 Action如何返回到视图中
Struts2框架 通过配置 result标签来 把Action的处理结果和视图对应,来决定Action返回到哪一个视图
1.Action的处理结果是一个字符串,Action把这个处理结果交给Struts2框架
2.Struts2框架决定这个处理结果对应哪个视图。
<struts>
<package name="users" namespace="/users" extends="struts-default">
<action name="*_*" class="action.{1}Action" method="{2}">
<!-- name:action返回结果,默认是success -->
<!-- result的值 如果有"/" 表示:.jsp页面的绝对路径 -->
<!-- result的值 如果没有有"/" 表示:jsp页面 是执行action所在的package-namespace指定的路径-->
<result name="success">/users/success.jsp</result>
</action>
</package>
</struts>
1. result标签-name属性 代表Action的返回值:Struts2框架内置的5个返回值
SUCCESS:Action正确执行,返回给响应视图
NONE:Action正确执行,不返回任何视图
FAILURE:Action执行失败,返回处理错误结果的视图。
LOGIN:Action因为没有登录而执行失败,返回登录视图
INPUT :Action执行需要从前端页面获取参数,但是对这些参数的验证不通过( 1.参数类型转换错误(在age等)2.某些input值不能为空等),将自动返回该视图
上面的意思是:如果Action中的某个方法返回的是SUCCESS,将对应配置文件中<result name="success">
,至于配置文件中<result name="success">
对应哪个视图,就由程序员说了算了。
public class LoginAction {
// 处理登录请求
public String login() {
// 如果用户名是amdin密码是123,用户登录成功
return SUCCESS;
}
}
<struts>
<package name="users" namespace="/" extends="struts-default">
<action name="*_*" class="action.{1}Action" method="{2}">
<result name="success">/users/users_login_success.jsp</result>
</action>
</package>
</struts>
处理结果类型INPUT比较特殊 Action会自动返回 INPUT
情况一:参数类型转换错误。如果表单的参数中含有整形变量,但是表单中提交的是字符串,这时Action会自动返回INPUT. 并不会返回Action自定义的返回值。
<form action="login.action" method="post">
<div>
用户名:<input type="text" name="username"></input>
</div>
<div>
年龄:<input type="text" name="age"></input>
</div>
<div>
<input type="submit" value="登录" />
</div>
</form>
public class LoginAction {
private String username;
private Integer age;
// 处理登录请求
public String login() {
if ("admin".equals(username) ) {
session.put("loginInfo", username);
return SUCCESS;
} else {
session.put("loginError", "用户名或密码错误");
return ERROR;
}
}
}
情况二:校验结果 this.addFieldError(“username”, “用户名不能为空”);中有数据
如果校验的 代码写在自定义方法中,要显示定义 返回INPUT
public String login() {
if (username == null || "".equals(username)) {
this.addFieldError("username", "用户名不能为空");
return INPUT;
}
if ("admin".equals(username) && "123".equals(password)) {
session.put("loginInfo", username);
return SUCCESS;
} else {
session.put("loginError", "用户名或密码错误");
return ERROR;
}
}
情况三:校验代码写在validate()方法中 并且校验结果 this.addFieldError(“username”, “用户名不能为空”);中有数据 会自动返回INPUT
@Override
public void validate() {
if (username == null || "".equals(username)) {
this.addFieldError("username", "用户名不能为空");
}
}
2. result标签的type属性 代表处理结果的类型
<action name="author">
<result name="success" type="">/users/success.jsp</result>
</action>
struts2支持多种视图技术:JSP, Valocity,FreeMarker等
result中的type类型,type属性值代表的是支持的视图类型
type的默认值是dispatcher 支持jsp视图技术
属性值:chain:将action和另外一个action链接起来。
属性值:redirect:重定向(会丢失请求参数)。
属性值:plaintext:返回网页源代码。
属性值:stream:返回inputstream用于文件下载。
3. result标签的子标签
<action name="author">
<result name="success">
<!-- location属性 定义了该视图赌赢的实际视图资源 -->
<param name="location">/users/success.jsp</param>
<!-- parse属性 执行是否可以在实际视图名字中使用OGNL表达式,默认可以 -->
<param name="parse">false</param>
</result>
</action>
4. Action的返回结果有两种类型:局部结果和全局结果。
局部结果:每个Action中的结果 局部结果把<result>
标签配置在<action>
标签中
全局结果:所有Action共用的结果 全局结果把<result>
标签配置在<global-results>
标签中
<struts>
<package name="pack001" extends="struts-default">
<!-- 如果是404错误 -->
<global-results>
<result name="ERROR404">/note.jsp</result>
</global-results>
</package>
</struts>