美文网首页
Struts2 入门

Struts2 入门

作者: 凉希凉兮 | 来源:发表于2017-06-26 19:25 被阅读0次

    struts2

    概念:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

    开发环境搭建

    1、拷jar包, 在apps包下,blank>WEB-INF>lib
    2、拷配置文件, 在apps包下,blank>WEB-INF>src>java>struts.xml
    3、拷过滤器配置, 在apps包下, blank>WEB-INF>web.xml
    4、将自己新建的action类配置到struts.xml中

    public String execute(){
            return "tohello";
        }
    
    
     <package name="default" namespace="/" extends="struts-default">
    <!-- package的namespace与action的name组成 浏览器访问路径 class是自己新建action的全类名 -->
    <action name="hello"  class="com.hemi.action.ActionTest">
        <!-- name自己新建action类return的字符串  /hello.jsp跳转的目标jsp -->
        <result name="tohello">/hello.jsp</result>
        </action>
    </package>
    

    struts2 核心类:StrutsPrepareAndExecuteFilter

    struts2 执行顺序

    1.jpg

    配置文件

    • constant 标签:

      • name="struts.devMode" value="true" 设置配置文件更改不会自动重新加载
      • name="struts.i18n.encoding" value="UTF-8" 设置框架的编码格式,默认UTF-8
      • name="struts.action.extension" value="do,," 设置页面访问时后缀名 默认action,, ,,表示加或者不加后缀都能访问
    • package 标签:

      • name:用来区分不同的action
      • extends:必须默认继承 struts-default
    • action 标签: 配置action处理类路径 和映射路径

      • method:指明要调用action中的哪个方法,不写默认执行execute方法
    • result 标签: 配置结果页面

      • name:逻辑视图名,是action类返回的逻辑视图名
      • 文本内容:物理视图名(jsp文件)
    • include 标签:用来引入其他配置文件,适合团队分模块开发

    action编写方式

    1、自定义类,编写execute方法

    2、实现Action接口

    3、继承ActionSupport类

    action方法访问方式

    1、传统访问,通过method属性指明

    2、通配符访问 *

    <!-- {表示第几个*号是方法名}   根据*输入的方法名 并根据该方法返回的字符串与resultname比对进行相应的跳转-->
    <action name="user_*" class="........."  method="{1}">
        <result name="ok"></result>
        <result name="fail"></result>
    </action>
    

    3、动态方法调用 ! action名!方法名.后缀 放开动态调用的常量是:struts.enable.DynamicMethodInvocation 为true 开启

    跳转方式

    • result 标签:type 属性来控制页面的跳转方式
      • jsp页面跳转(默认)转发 dispatcher 重定向 redirect
      • Action之间跳转 : 转发 chain 重定向redirectAction
            <!-- 默认转发 dispatcher -->
            <result name="login">/login.jsp</result>
            <result name="register">/register.jsp</result>
            <!-- jsp页面的重定向 -->
            <result name="menu" type="redirect">/menu.jsp</result>
            <!-- action之间的重定向 -->
            <result name="fail" type="redirectAction">user_register</result>
    

    注意不同papackage标签的Action之间的跳转 需要注入
    通过两个param标签(放在result标签内) 注入 name="actionName" 和 name="nameSpace"

        <result name="success" type="redirectAction">
            <!-- 另一个package中action的name -->
            <param name="actionName">hello</param>
            <!-- 另一个package的namespace -->
            <param name="nameSpace">/</param>
        </result>
    

    动态结果页面配置

    1、在action类中定义一个字符串变量,并提供get方法 在每个方法内设置该字符串来决定物理视图名,指定要跳转的目标页面

    public class MyAction {
        private String view;
        public String getView() {
            return view;
        }
        public void setView(String view) {
            this.view = view;
        }
        public String test1(){
            setView("test1.jsp");
            return "ok";
        }
        public String test2(){
            setView("test2.jsp");
            return "ok";
        }
        public String test3(){
            setView("test3.jsp");
            return "ok";
        }
    }
    

    2、在result 的文本配置成获取物理视图属性 通过${action中的字符串变量名}

    <action name="test_*" class="com.hemi.action.MyAction" method="{1}">
        <result name="ok">/${view}</result>
    </action>
    

    Servlet API的操作,也就是获取参数

    1、耦合方式 ServletActionContext.getRequest()

    //耦合方式
            HttpServletRequest req = ServletActionContext.getRequest();
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            System.out.println(username);
            System.out.println(password);
            if ("admin".equals(username) && "123".equals(password)) {
                req.setAttribute("username", username);
                req.setAttribute("password", password);
                setView("success.jsp");
                return "ok";
            }
            setView("login.jsp");
            return "fail";
    

    2、解耦方式 ActionContext.getContext()

            //解耦方式
            ActionContext context = ActionContext.getContext();
            Map<String, Object> map = context.getParameters();
            
            String[] username = (String[]) map.get("username");
            setView("test3.jsp");
            return "ok";
    

    3、ioc注入 实现ServletRequestAware接口在类里声明HttpServletRequest
    并重写setServletRequest方法 在里面写this.request=req;(给类中的全局变量赋值)

    public class MyAction implements ServletRequestAware {
        private String view;
    private HttpServletRequest request;
    //ioc注入
    public String test2() {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println(username);
            System.out.println(password);
            if ("admin".equals(username) && "123".equals(password)) {
                request.setAttribute("username", username);
                request.setAttribute("password", password);
                setView("success.jsp");
                return "ok";
            }
            setView("login.jsp");
            return "fail";
        }
    
        @Override
        public void setServletRequest(HttpServletRequest req) {
            this.request=req;
        }
        }
    

    数据校验

    1、首先继承ActionSupport

    2、校验全部方法 重写 validate方法

    3、校验指定方法 自定义方法 validate+校验的方法名(注意:方法首字母大写)

    4、添加校验错误信息 addFieldError

            //System.out.println("校验test1方法");
            String username = request.getParameter("username");
            if (username.length()==0) {
                addFieldError("username", "用户名不能为空");
            }
    

    5、配置文件中加一个result name为input

    <result name="input" type="redirect">/login.jsp</result>
    

    相关文章

      网友评论

          本文标题:Struts2 入门

          本文链接:https://www.haomeiwen.com/subject/axijcxtx.html