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里边的一模一样的参数名来赋值,也可以是类



模型驱动:要实现ModelDriven接口,可以不管action内部是什么类,直接找相同的属性赋值
当调用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信息)

<s:property value="errors.name[0]"/>   取Property name是errorrs的property Value中key是name(一个list)的的第一项
Struts2专题  基础2 - night person - 夜归人
 

获取WEB元素:
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
原创粉丝点击