Struts2专题 基础2
来源:互联网 发布:php dom 教程 编辑:程序博客网 时间:2024/05/16 02:04
namespace决定了action的访问路径,默认为"",可以接收所有路径的action
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action, /xxx/index.action,或者/xxx/yyy/index.action.
namespace最好也用模块来进行命名
<package name="front" extends="struts-default" namespace="/front">
<action name="index">
<result>/Namespace.jsp</result>
</action>
</package>
//package 和JAVA里边的package一样,避免重名的
namespace必须用/开始,可以为""
凡是 <result name=success>的 都可以省略name=success 不写
以上配置 访问这个index 可以这样: http://localhost:8080/工程名/frond/index
action:
<constant name="struts.devMode" value="true" />
<package name="front" extends="struts-default" namespace="/">
<action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
<result name="success">/ActionIntroduction.jsp</result>
</action>
</package>
这里的class 自己指定。IndexAction1有三种方式可以实现:
1.具体Action的实现可以是一个普通的java类,里面有public String execute方法即可
2.实现Action接口
3.最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法
第一种方式:
package com.bjsxt.struts2.front.action;
public class IndexAction1 {
public String execute() {
return "success";
}
}
第二种方式:
package com.bjsxt.struts2.front.action;
import com.opensymphony.xwork2.Action;
public class IndexAction2 implements Action {
@Override
public String execute() {
return "success";
}
}
第三种方式(最常用)
package com.bjsxt.struts2.front.action;
import com.opensymphony.xwork2.ActionSupport;
public class IndexAction3 extends ActionSupport {
@Override
public String execute() {
return "success";
}
}
这个class的对象 是每次访问的时候创建。
如果木有指定class则会默认执行 ActionSupport
路径:
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
index.jsp
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath
Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
前者会产生太多的action,所以不推荐使用
<package name="user" extends="struts-default" namespace="/user">
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
第一种情况 method指定要调用的方法 ,这个方法返回一个string就可以
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
第二种动态调用:可以用
http://localhost:8080/工程名/user/user!add (DMI)
</package>
通配符: 如果通配符也匹配,不用通配符也匹配则匹配最精确的
<struts>
<constant name="struts.devMode" value="true" />
<package name="actions" extends="struts-default" namespace="/actions">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
</struts>
接受参数:
<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>
UserAction 里边可以有成员变量,成员变量有get,set方法 则 会根据url里边的一模一样的参数名来赋值,也可以是类
当调用action时候,会调用 getModel方法,得到user对象 然后找相应的属性赋值
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;
}
}
三种参数接受方式:参数接受 , 对象接受(dominDriven) , ModelDriven
中文处理方式:有中文一般用post方式提交
struts配置文件里边 加入: <constant name="struts.i18n.encoding" value="GBK" />
一般能解决,如果还不变 是BUG
简单数据验证:
public class UserAction extends ActionSupport {
private String name;
public String add() {
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");
return ERROR;
}
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
前台:JSP 要接受这个提示信息则:
<%@taglib uri="/struts-tags" prefix="s" %>
.....
<body>
User Add Error!
<s:fielderror fieldName="name" theme="simple"/> //这样的输出是有格式的
<br />
<s:property value="errors.name[0]"/> //输出木有格式 第一个是 name is error 第二个是:name is too long
<s:debug></s:debug> //一个debug超链接
</body>
通过值栈来实现
s:property 取 value stack , stack Context的值,errors取到的是一个map, errors.name取到map里边的list,
errors.name[0]取第一项(点超链接看debug信息)
errors.name[0]取第一项(点超链接看debug信息)
<s:property value="errors.name[0]"/> 取Property name是errorrs的property Value中key是name(一个list)的的第一项
1.通过map方式获取: 其实这里取的是值栈里边的stack Context部分(后台),访问这一部分key前面需要加#
上面一节说的value stack 不需要#
public class LoginAction1 extends ActionSupport {
private Map request;
private Map session;
private Map application;
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
}
不能用setAttribute方法,只能用put,因为得到的是一个map
2第二种方式 通过接口 获取 IOC(inverse of control)方式 也称为DI(dependency injection) 一般都用这种
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
//DI dependency injection
//IoC inverse of control
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
第三种 获得 真正的 request
public class LoginAction3 extends ActionSupport {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public LoginAction3() {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
}
第四种:
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
}
四种方式:对应的前台:
<br />
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
<s:property value="#attr.a1"/><br /> 这种很少用,不推荐 他会顺着搜 request,session 直到搜到位置
<s:property value="#attr.s1"/><br />
<s:property value="#attr.r1"/><br />
<s:debug></s:debug>
<br />
包含:xml 配置
<struts>
<constant name="struts.devMode" value="true" />
<include file="login.xml" />
</struts>
默认action:如果访问时候 找不到对应的action 就用default-action-ref 指定的action来取代
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
</struts>
返回类型:
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r1.jsp</result> //服务器跳转
</action>
<action name="r2">
<result type="redirect">/r2.jsp</result> //客户端跳转
</action>
<action name="r3">
<result type="chain">r1</result> //跳到action 有问题
</action>
<action name="r4">
<result type="redirectAction">r2</result>
</action>
</package>
</struts>
全局返回类型:
<package name="user" namespace="/user" extends="struts-default">
<global-results> //这个包里边 所有action共用
<result name="mainpage">/main.jsp</result>
</global-results>
<action name="index">
<result>/index.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_success.jsp</result>
<result name="error">/user_error.jsp</result>
</action>
</package>
<package name="admin" namespace="/admin" extends="user">
//extends 继承 就可以使用user包里边的 global-results
<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
<result>/admin.jsp</result>
</action>
</package>
动态结果集:
配置文件从value stack中取值
action中内容:
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
xml配置:
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
</package>
</struts>
result传值:
把action 的值 调到其他JSP页面
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
</action>
</package>
</struts>
这种方式 值redirect跳转到其他页面jsp, jsp里边要取这个参数t,不能用取value
stack的方式取,因为是直接跳到 jsp,无action 所以木有 value stack,所以不能用<s:property value="t"/>的方式取 。一次request只有一个值栈,服务器端forward 是共享同一个value stack
对应的JSP 页面:
<body>
User Success!
from valuestack: <s:property value="t"/><br/> 这种方式不行
from actioncontext: <s:property value="#parameters.t"/>
<s:debug></s:debug>
</body>
0 0
- Struts2专题 基础2
- Struts2专题框架
- struts2专题:环境
- struts2专题 nameSpace
- Struts2复习专题
- Struts2基础总结-2
- Struts2基础(2)
- struts2(基础2)
- Struts2基础复习系列(2)
- Struts2入门基础小结2!
- AJAX基础应用专题
- K线图基础专题
- php专题-mysql基础
- 专题:基础计算几何
- 【Http专题】基础
- 几何基础专题
- 【专题】基础动态规划
- struts2基础
- JS专题2:变量 作用域和内存问题
- [.Net码农](转)图解WPF程序打包全过程
- JS 专题3 引用类型
- JS 专题4 理解面向对象
- struts2专题:环境
- Struts2专题 基础2
- struts2专题 nameSpace
- struts专题 OGNL 表达式
- struts专题 标签
- struts 基础 异常
- Weblogic 基础-创建domain
- ural 1119. Metro(dp)
- Weblogic基础-启动 MS
- Weblogic基础-Boot Identity File