zoukankan      html  css  js  c++  java
  • Structs2-Action

    namespace为空
    action指定class,将会执行Action::execute,返回一个字符串,然后根据字符串,寻找result,实现Action接口,继承ActionSupport
    namespace 没有,那么交给welcome-liist这个文件
    href超级链接,--绝对路径 ,base_path <在head中设置base标签》
    <base href="<%=basePath%>">
    <action name="hello" class="org.com.structs.test.MyAction" method="add">
    Action里面不一定需要
    DMI动态方法调用
    <body>
    Hello Structs2<br>
    <a href="<%=basePath%>myjsp!add">Hello</a> #//这样当有多个方法时候,写一个action就可以了,不用一个method指定一个action
    </body>
    action定义:
    public class MyAction extends ActionSupport {
    public String add()
    {
    return "lai";
    }
    }
    <action name="myjsp" class="org.com.structs.test.MyAction">
    <result name="lai">
    /MyJsp.jsp
    </result>
    </action>
    动态方法调用是,必须在stucts.xml中打开,
    这个常量必须设置为true <constant name="struts.enable.DynamicMethodInvocation" value="true" /
    ===================
    通配符匹配的
    为什么不用DMI?DMI会有多个result配置出来
    action name使用通配符可以使用
    首先匹配最精确的

    src里面配置action,而不是在Lib里面,想想就是
    在structs.xml文件中指定
    <package name="default" namespace="/" extends="struts-default">
    <action name="*_*" class="org.com.lai.wizard.MyAction" method="{2}">
    <result name="{2}">
    /{1}{2}.jsp
    </result>
    </action>
    </package>
    对action进行通配符设置,{1}表示对name的第一个通配符,{2}表示匹配第二个*的通配符

    =========================================
    用Action数学来接收
    在Action里面获取参数,在调用action:method时候,在action里面设置每个变量对应的setter方法和getter方法,可以获取传入的参数
    http://laicb-pc:8080/ParamterSet/add?name=lai&age=222
    public class MyAction extends ActionSupport {
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getAge() {
    return age;
    }
    public void setAge(String age) {
    this.age = age;
    }
    String name;
    String age;
    public String add()
    {
    System.out.println("String="+name);
    System.out.println("Age="+age);
    return "add";
    }

    }
    Action里面通过设置getter和setter方法,structs会把路径里面的参数传递到action里面
    getter和setter方法快速生成,getter和setter方法 sorce->genrate getter和setter
    sysout ===> alt+/ 生成

    ========================================
    通过DomainModel来接受参数信息
    http://laicb-pc:8080/DomainModel/hell?user.name=lai&user.age=30
    User声明name,age两个字段,设置getter和setter方法

    在Action中,声明一个User user类来接收参数,那么就可以在url指定参数user.name,user.age
    action将参数建立DTO(数据转换对象),然后new User(DTO)传入,创建DomainModel,然后就使用DomainModel模型了。

    ================
    通过ModelDriven来传递参数
    =======================
    Action进行数据校验,检查某一个数据是否合法,在Action方法中,是返回
    addFiledError在value stack里面添加了一个map,在jsp中通过filedErrors
    数据校验主要是错误的呈现,没有request或者response这类可以使用,那么就直接返回ERROR
    通过add方法,当校验成功的时候返回SUCCESS,错误的时候返回ERROR
    public String add()
    {
    if(user.name.equals("lai")&&user.age.equals("123456"))
    {
    return SUCCESS;
    }
    this.addFieldError("name", "name && age is not suitable");
    this.addFieldError("name", "name && age is too long");可以同时对一个名字多次添加错误信息。
    return ERROR;
    }

    在对于的ERRORJSP视图中,通过taglib来获取所获得的字符串错误
    <%@taglib uri="/struts-tags" prefix="s" %>
    <s:fielderror fieldName="name" /> ---就可以取出数据了
    <s:property value="errors.name[0]" />
    <s:debug></s:debug>
    structs.xml是这样配置的
    <action name="user" class="com.lai.validate.action.MyAction">
    <result name="error">
    /errors.jsp
    </result>
    <result name="success">
    /success.jsp
    </result>
    </action>
    通过DMI方法来调用add方法user!add

    ====================================
    访问web元素
    第一种方法:
    Action里面如何访问Web元素,在Action中
    public class Action1 extends ActionSupport {
    Map<String,Object> request;
    Map<String,Object> session;
    Map<String,Object> application;
    public Action1()
    {
    request = (Map<String,Object>)ActionContext.getContext().get("request");
    session = ActionContext.getContext().getSession();
    application = ActionContext.getContext().getApplication();
    }
    public String execute()
    {
    request.put("r1","21");
    session.put("s1", "v1");
    application.put("d1", "l1");
    return SUCCESS;
    }
    }
    通过ActionContext可以获得上下文,获得request,session,application等,可以看到这三者是Map类型的
    通过put可以往里面传入我们想要反馈到前台的东西
    ,前台jsp又特么如何访问Action中的request和session,application呢?
    通过<s:property value="#request.r1">
    <s:property value="#session.s1">
    <s:property value="#application.d1"> 这些属性在debug标签里面都可以看到,这样就实现了前后台的交互了
    jsp中我们还有request变量,session变量,application变量,通过getAttribute方法可以获取这些数据,同样的
    <s:property value="#request.r1"/><br/>
    <s:property value="#session.s1"/><br/>
    <s:property value="#application.d1"/></br>
    <s:debug></s:debug>
    =====
    java反射机制,reflection,可以获得运行时的class的属性方法等。
    访问web元素第二种方法就是通过IOC inverse of control ,或者DI dependency injection来获取request,session的方式来进行
    Action只要实现三个接口RequestAware接口,SessionAware,ApplicationAware接口。实现setReuest,setSession,setApplication方法就可以了。
    来进行。
    structs2可以获得这些数据,然后为Action是否实现了上面三种接口,通过反射机制可以知道。然后由structs来设置这些参数,一般我们只会用到session,而request一般不会用到。
    public class Action2 extends ActionSupport implements RequestAware,
    SessionAware, ApplicationAware {
    Map<String,Object> request;
    Map<String,Object> session;
    Map<String,Object> application;
    public String execute()
    {
    request.put("r1","21");
    session.put("s1", "v1");
    application.put("d1", "l1");
    return SUCCESS;
    }
    public void setRequest(Map<String, Object> request) {
    // TODO Auto-generated method stub
    this.request = request;
    }
    public void setSession(Map<String, Object> session) {
    // TODO Auto-generated method stub
    this.session = session;
    }
    public void setApplication(Map<String, Object> application) {
    // TODO Auto-generated method stub
    this.application = application;
    }
    }
    依赖注入,意思是request的值依赖于别人的来注入,叫依赖注入,控制反转的意思就是本来request,session这些值都是自己主动去获取的,但是现在控制权交由structs去了,由structs来设置控制权。
    ======================
    第三种访问webelement的方法,通过
    HttpServletRequest request = ServletActionContenxt.getRequest();
    HttpSession session = request.getSession();
    HttpServletContext application = session.getServeletContext();
    ==============
    第四种方法,通过实现ServletRequestAware接口,重载getServeltRequest接口来获得request,然后通过第三种方法来获得其他的。

    ===============
    structs模块包含
    <include file="login.xml"/> 把login.xml复制过来。
    默认action
    在action中找不到,就可以用默认action
    在structs.xml中写入<default-action-ref name="index"></default-action-ref>

  • 相关阅读:
    java常量和变量的定义规则,变长参数的使用
    测试一下windowsLiveWriter
    对转换公式为LaTeX代码要注意什么
    后台登陆骨架
    为什么要把session存入数据库
    登录功能测试
    数据库快速配置
    一个小bug
    后台测试常需要的htm样式
    在分页的基础上添加删除和(查看,原理和删除一样)
  • 原文地址:https://www.cnblogs.com/championlai/p/3842380.html
Copyright © 2011-2022 走看看