struts2入门2

来源:互联网 发布:淘宝提交多个订单 编辑:程序博客网 时间:2024/05/16 11:39
1、web.xml下配的struts的filter(执行了这个filter到struts.xml就不会再回来执行其它的filter),所以要放在最后执行。
2、对于Action里封装的是bean类的时候
    public class paramAction extends ActionSupport{
    private User user;
    public User getUser() {
        System.out.println("user get");
        return user;
    }
    public void setUser(User user) {
        System.out.println("user set");
        this.user = user;
    }
    public class User {
    private int id;
    private String name;
    private int age;
    public User(){
        System.out.println("constructer");
    }
    public int getId() {
        System.out.println("get id");
        return id;
    }
    public void setId(int id) {
        System.out.println("set id");
        this.id = id;
    }
    public String getName() {
        System.out.println("get name");
        return name;
    }
    public void setName(String name) {
        System.out.println("set name");
        this.name = name;
    }
    public int getAge() {
        System.out.println("get age");
        return age;
    }
    public void setAge(int age) {
        System.out.println("set age");
        this.age = age;
    }
}
结果是:user get
constructer
user set
set age
user get
set id
user get
set name



分析:他第一次调用getUser()会去调用构造函数,去产生一个到后面调用这个getUser()时
就不会产生了。并且他只会调User类的setXx()方法。去赋值。并不会用到getXx()方法。
一定要有getUser()方法,否则每次都产生一个对像,也就只能赋一个性。下回又产生一个。
3、对于Action里封装的是implements ModelDriven的类时候
    public class modelAction extends ActionSupport implements ModelDriven<User>{
    private User user;
    public User getUser() {
        System.out.println("model get");
        return user;
    }
    public void setUser(User user) {
        System.out.println("model set");
        this.user = user;
    }

    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        if(user==null){
            user=new User();
            return user;
        }
        return    user;
    }
结果:constructer
set age
set id
set name
分析:他不会调用Action类下的getXX()和setXx()方法,不过注意的是上面的对于jsp页面name="user.id"  这里直接写name="id"其它项一样。
4、跳转
    内部:
        Action类-->前台显示页面(jsp)用 type="Dispatcher"
        
        Action类-->Action类           用 type="chain"
        对于跨包的Action类得配
            <result type="chain">
                <param name="actionName">first</param>
                <param name="namespace">/basic</param>
            </result> -->
        
    重定向:
            Action类-->前台显示页面(jsp)用 type="Redirect"
        Action类-->Action类           用   type="RedirectAction"
5、配置全局的返回
        <global-results>
            <result name="error">error.jsp</result>
        </global-results>
        对于全部的action类返回的error字符串,都利到error.jsp
6、要是把上面这句话配置到一个包(package)中,这样全部的包都继承它(添加abstract="true"),这样所有的包都共用这个error.jsp。
    abstract="true"意味着这个包中的方法是继承的,并不能用来访问。
    <package name="default" extends="struts-default" abstract="true">
        <global-results>
            <result name="error">error.jsp</result>
        </global-results>
    </package>
7、配置package中默认的action(出错时跳转的页面)
    对于web.xml下也可以配
    <error-page>
        <error-code>404</error-code>
        <location>/index.jsp</location>
    </error-page>
    法一:(DMI)动态方法调用
        actionName!methodName.action
            
    法二:
        在struts.xml下为每个method配置action.
    第三种创建Action的方法
    pbulic class CustomerAction extends ActionSupport{
             public String execute(){
                 return null;
             }
             publci String login(){
                 return null;
             }
             public String register(){
                 return null;
             }
    }
    多了一个login()方法;
    此时如果配<action name="customer" class="CustomerAction">
    访问customer.action。还是执行的execyute()方法
    根据法一如果你访问:customer!login.action就能执行 login()方法
                                            customer!register.action就能执行register()方法
    这些方法都要返回字符串。
     根据法二配struts.xml
     <action name="customer_execute" class="CustomerAction">
         <result>/index.jsp</result>
     </action>
    <action name="customer_login" class="CustomerAction" mehtod="login">
         <result>/index.jsp</result>
     </action>
     <action name="customer_register" class="CustomerAction" mehtod="register">
         <result>/index.jsp</result>
     </action>
8、使用通配符来配置Action
        CustomerLoginAction
        CustomerRegisterAction
        常规配:
        <action name="Customerlogin" class="CustomerLoginAction"></action>
        <action name="Customerregister" class="CustomerRegisterAction"></action>
        换成:
        <action name="Customer*" class="Customer{1}Action"></action>
        访问CustomerLogin.action
        此时:
        *代表Login {1}代表第一个*的值。
        有二个*的情况:
            <action name="*_*" class="{1}{2}Action"></action>
    类名:
                CustomerLoginAction
                ProductAddAction
    对应:
                CustomerLogin
                ProductAdd
                访问Customer_Login.action
                第一个*代表Customer第二个*代表Login
            {    1}{2}分别代表Customer和Login
            如果对应的是AddProduct
            访问Add_Product.action
             产生的class为AddProducAction和所产生的类不符出错
        他的应用一般是
        <action name="*">
                <result>/404.jsp</result>
        </action>
        应当放在最后面,其它的action找不到时,就运行它。
        有专门的标签管理这个应用
        <default-action-ref name="default"></default-action-ref>
        <action name="defalut">
            <result>/404.jsp</result>
        </action>
        配到那个abstract="true"的大家就都可以使用了。
9在action中获取web元素(request,session,application)
requst里面保存属性是以一个Map保存的
所以我们有二种方式获取request
法一:
    直接获取request
      第一种方式:自己主动获得
        获得原类型request对象
        HttpServletRequest req = ServletActionContext.getRequest();
        获得原类型response对象
        HttpServletResponse res = ServletActionContext.getResponse();
        获得原类型session对象
        HttpSession sess = req.getSession();
        获得原类型application对象
        ServletContext app1 = sess.getServletContext();
        或者
        ServletContext app2 = ServletActionContext.getServletContext();
        第二种方式:自己被动接收
        struts2框架中提供了一个接口,可以用来获得原类型的request对象,因为通过原类型的request对象就可以获得原类型的session对象和原类型的application对象
        实现接口:ServletRequestAware,然后struts2框架会通过action所实现的抽象方法,把原类型的request对象自动放到action里面.
        类似的还有一接口:ServletResponseAware,和上面的效果、用法是一样的。
法二:

    获取他里面保存的map

未完明天继续。。。。。           
0 0
原创粉丝点击