struts学习笔记

传统的mvc模式

Struts开源架构很好的实现了MVC模式,MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。

实现一个简单的struts案例

实现步骤

  • 创建一个javaweb工程,并选中struts2,
  • 创建jsp页面(创建视图)
  • 创建action类(Action 类是 Struts 2 应用程序的关键,并且我们在 action 类中实现大部分的业务逻辑)
  • 配置文件

创建一个javaweb工程,并选中struts2,

在idea中创建好之后,会自动导入struts相关的核心包,并在web.xml中初始化配置一些相关的文件

完整项目路径

创建index.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: pc
  Date: 17-5-22
  Time: 上午8:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
hello!
  </body>
</html>

成功时,会在jsp中显示一句话hello!

创建action类 UserAction

package action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Created by pc on 17-5-22.
 */
public class UserAction extends ActionSupport {

    //action中业务处理方法
    public String login() {
        System.out.println("User.action");
        return "success";
    }

    public String register() {
        System.out.println("User.action User.action");
        return "success";
    }
}

1.Action映射:
action映射是Struts2框架中的基本” 工作单元”,action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。


属性   是否必须    说明
name      是      action的名字,用于匹配URL
class     否      Action实现类的完整类名
method    否     执行Action类时调用的方法
convert   否     应用于action的类型转换的完整类名

2.使用method属性
在配置action时,我们可以通过action元素的method属性来指定action调用的 方法,所指定的方法,必须遵循与execute方法相同的格式。

配置文件

  • 在web.xml中需要如下配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
  • 在action包下需要再次创建一个struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- 包配置:一般都要继承struts-default,因为该包有默认的拦截器等东西 -->
    <!--namespace:命名空间,考虑到可能出现相同的action,如果有命名空间就可以解决  -->
    <package name="config" namespace="/user" extends="struts-default" abstract="false">
         <!-- 定义一个action -->
         <!--对应UserAction中login方法-->
        <action name="login" class="action.UserAction" method="login">
             <!--  返回一个String常量,转发至对应的JSP页面--> 
            <result name="success">/index.jsp</result>
        </action>
        <!--对应UserAction中register方法-->
        <action name="register" class="action.UserAction" method="register">
            <result name="success">/index.jsp</result>
        </action>
    </package>

</struts>

常量配置:用到 constant 标签 ,name 和 value 两属性

命名空间: namespace=”/user”,http://localhost:8080/user/login.action 查找条件是优先到指定命名空间寻找对应的action,如果找到就用不再继续找,如果找不到,则到默认的命名空间找,否则报错。

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。

  • 在src根目录下面找到struts.xml,这个文件称为总配置文件,作用是引入其他所有配置文件
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <!--全局配置-->
    <!--1.修改struts默认的访问后缀-->
    <constant name="struts.action.extension" value="action,do,"/>
    <!--总配置文件,引入其他所有配置文件-->
    <include file="action/struts.xml"></include>
</struts>

struts2的工作流程

  1. 客户端提起一个(HttpServletRequest)请求,在浏览器中输入http://localhost:8080/user/login就是提起一个(HttpServletRequest)请求。其中user就是namespace="/user",login<action name="login" class="action.UserAction" method="login">
  2. 在web.xml文件中定义核心Filter拦截用户请求。
  3. 通过post或get提交请求。
  4. 定义处理用户请求的Action类。在MVC框架中,控制器C实际上是由拦截所有用户请求,处理请求的通用代码两个部分共同组成的,实际的业务逻辑则由Action来处理。
成功时的截图
UserAction中打印的字符串

struts.xml中常用到的标签

1、<include>
利用include标签,可以将一个struts.xml配置文件分割成多个配置文件,然后在struts.xml中使用<include>标签引入其他配置文件。
3、<package>
1、包

在Struts2框架中是通过包来管理action、result、interceptor、interceptor-stack等配置信息的。包属性如下:

属性          是否必需       描述

name            是        包名,作为其它包应用本包的标记
extends      否      设置本包继承其它包
namespace      否        设置包的命名空间
abstact      否      设置为抽象包
<package name="config" namespace="/user" extends="struts-default" abstract="false">
        <action name="login" class="action.UserAction" method="login">
            <result name="success">/index.jsp</result>
        </action>

        <action name="register" class="action.UserAction" method="register">
            <result name="success">/index.jsp</result>
        </action>
    </package>

2、extends

当一个包通过配置extends属性继承了另一个包的时候,该包将会继承父包中所有的配置,包括action、result、interceptor等。
由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。
通常我们配置struts.xml的时候,都继承一个名为“struts-default.xml”的包,这是struts2中内置的包。

<package name="config" namespace="/user" extends="struts-default" abstract="false">

3、namespace

namespace主要是针对大型项目中Action的管理,更重要的是解决Action重名问题,因为不在同一个命名空间的Action可以使用相同的Action名的。

namespace="/user"

4、<action>与<result>

1、<action>属性介绍

属性名称  是否必须  功能描述

name        是   请求的Action名称
class      否    Action处理类对应具体路径
method    否 指定Action中的方法名
converter   否   指定Action使用的类型转换器

如果没有指定method则默认执行Action中的execute方法。

2、<result>属性介绍

属性名称 是否必须 功能描述

name    否   对应Action返回逻辑视图名称,默认为success
type    否   返回结果类型,默认为dispatcher

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

推荐阅读更多精彩内容