Struts2 入门

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容