struts2入门一

什么是struts2

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

Struts2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

常见的WEB层框架

struts2  struts   Webwork   springMVC

基于前端控制器的模式的WEB层框架

   传统的开发模式:每一个请求都对应一个Servlet,这样会造成一个项目中的servlet过多。
   在struts2中,所有的请求事先都会经过一个前端控制器,在前端控制器实现部分的功能,然后剩下的功能交由Action完成。
   struts2前端控制器是由过滤器来实现的,在访问资源之前,所有的东西都会经过这个过滤器。

传统开发模式.png
前端控制器模型.png

struts2快速入门

struts2 官网    我们这里使用的是struts2.5版本

struts2.5 jar包.png

创建一个JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>struts2入门一</p>
    <form action="${pageContext.request.contextPath}/demo.action" method="post">
        username:<input type="text" name="username"><br/>
        password:<input type="password" name="password"><br/>
        <input type="submit" value="submit" />
    </form>
</body>
</html>

编写一个Action

public class HelloAction {
    public String execute() {
        System.out.print("hello world");
        return "none";
    }
}

接下来,将JSP页面的数据提交到Action中,需要我们对Action进行配置

  • 在src目录下新建一个struts.xml文件,并写上以下代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="demo" extends="struts-default" namespace="/">
        <action name="demo" class="cn.robin.demo01.action.HelloAction"  />
    </package>
</struts>

最后一步就是配置核心过滤器

  • 在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_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

启动服务器之后,通过浏览器访问的时候,我们只看到控制台中输出hello world,浏览器中并没有出现页面跳转。
通过Action类的返回值,并在struts2.xml文件进行配置,我们就能实现页面跳转的功能。

  • 修改 HelloAction
public class HelloAction {
    public String execute() {
        return "success";
    }
}
  • 修改struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
      <package name="demo" extends="struts-default" namespace="/">
          <action name="demo" class="cn.robin.demo01.action.HelloAction" >
              <!--配置跳转页面,通过Action的返回值,跳转到index.jsp页面-->
              <result name="success" >/index.jsp</result>
          </action>
    </package>
</struts>

重新发布项目,继续通过浏览器访问,我们可以看出,在访问JSP页面提交数据之后,页面会跳转到index.jsp,我们这样就实现了页面跳转的功能。

struts2常见的配置

  • 配置文件的加载顺序
    每次客户端访问服务器的时候,都必须经过struts2的核心过滤(StrutsPrepareAndExecuteFilter),该过滤器有两个功能:预处理和执行。
    • 预处理:用来加载配置文件,对应过滤器的init()方法
    • 执行:过滤器拦截功能,对应过滤器的doFilter()方法


      StrutsPrepareAndExecuteFilter类中方法

在StrutsPrepareAndExecuteFilter类中的init()方法,调用init.initDispatcher(config)

  • 调用init().png

在init.initDispatcher(config)中,又调用类init()方法

  • init().png
  • 配置文件加载代码
  • init_DefaultProperties(); // [1] 加载org.apache.struts.default.properties配置的所有常量

  • init_TraditionalXmlConfigurations(); // [2] 加载struts-default.xml struts-plugin.xml struts.xml

  • init_LegacyStrutsProperties(); // [3] 加载用户自定义struts.properties

  • nit_CustomConfigurationProviders(); // [5] 加载用户配置的提供对象

  • init_FilterInitParameters() ; // [6] 加载web.xml

  • init_AliasStandardObjects() ; // [7] 加载标准对象

前面3个配置文件是属于struts2内部的配置文件,我们无法修改。
struts.xml struts.properties web.xml是我们可以修改的文件。
这三个配置文件可以修改struts2常量的值,加载的时候有一定的顺序,但是,后加载的配置文件一定会覆盖先在家的配置文件的值。

Action的配置

  • struts2核心配置文件是struts.xml,该文件用来配置Action和请求的对应关系
  • struts2核心的组件是Action和过滤取,使用包的方式来管理它们。一个包可以包含多个Action和过滤器。在struts.xml中,用<package>来表示。

1. package

属性 说明
name 必填属性,该包的名称,用来被其它包引用的key
namespace 可选属性,用于定义该包的名称空间
extends 可选属性,用于说明该包继承哪个包,可以继承包中Action和拦截器
abstract 可选属性,指出该包是不是抽象包,抽象包不能定义Action
  • extends一般值为struts-default,这样就继承来struts2默认的过滤器等功能。
  • namespace属性的值
    • 默认名称空间:namespace = ""
    • 根名称空间:namespace = "/"
    • 一般的名称空间:namespace = "/xxx"

2. Action

  • Action的配置就是讲一个请求的URL映射到一个Action类中
属性 说明
name 必填属性,标识Action,指定了Action访问的URL
class 可选属性,指定了Action的全路径类名
method 可选属性,指定了请求Action时跳用的方法
converter 可选属性,指定类型转换器的类
  • namespace和name共同指定乐访问路径
  • class是类的全路径名
  • method默认是execute()

3. 常量的配置

  1. 在struts.xml中用<constant>
 <constant name="struts.i18n.encoding" value="UTF-8" />
  1. 在web.xml中用<init-param>
<init-param>
    <param-name>struts.i18n.encoding</param-name>
    <param-value>UTF-8</param-value>
</init-param>
  1. 在struts-properties中配置
struts.i18n.encoding = UTF-8

4. 分模块开发的配置

  • 为了解决不同人操作同一个 struts.xml,我们可以使用<include>标签引入其它的struts.xml(默认只加载WEB-INF classes下面的struts.xml)
<include file="cn/robin/demo/struts.xml" />

注意:每一个子struts.xml,必须都含有DTD约束,struts2配置文件的信息等

Action的编写

  1. 一个POJO(Plain Ordinary Java Object)类
/*
要有一个无参数的构造方法和一个execute()方法
execute()方法要求
  public
  返回一个字符串,指向下个页面Result
  方法没有参数
*/
public class HelloAction {
    public String execute() {
        return "none";
    }
}
  1. 实现Action接口
public class MyAction implements Action {
    @Override
    public String execute() throws Exception {
        return Action.SUCCESS;
    }
}

该接口还定义了5个常量

  • 五个常量.png
  1. 继承ActionSupport类(推荐使用)
public class MyActionSupport extends ActionSupport {
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

Action的访问

之前我们是一个请求编写一个Action,那么当很多的请求的时候,我们需要编写很多个Action。现在,我们需要做的就是如何多个请求对应一个Action。
1.编写页面

<body>
    <a href="${pageContext.request.contextPath}/saveAction.action" >保存</a>
    <a href="${pageContext.request.contextPath}/addAction.action" >增加</a>
    <a href="${pageContext.request.contextPath}/updateAction.action" >修改</a>
    <a href="${pageContext.request.contextPath}/deleteAction.action" >删除</a>
</body>

2.编写Action

public class Demo extends ActionSupport {
    public String save() {
        return NONE;
    }
    public String add() {
        return NONE;
    }
    public String update() {
        return NONE;
    }
    public String delete() {
        return NONE;
    }
}

3.配置Action

<package name="demo" extends="struts-default" namespace="/">
    <action name="action" class="cn.robin.demo.action.HelloAction"  method="save" />
    <action name="action" class="cn.robin.demo.action.HelloAction"  method="add" />
    <action name="action" class="cn.robin.demo.action.HelloAction"  method="update" />
    <action name="action" class="cn.robin.demo.action.HelloAction"  method="delete" />
</package>
  • 但是我们发现,同一个Action配置了很多次,我们只需要修改method的值而已。有没有可以只需要配置一次的呢?答案是有的!有两种方式

1.使用通配符配置方式

  • 编写Action
public class Demo extends ActionSupport {
    public String save() {
        return NONE;
    }
    public String add() {
        return NONE;
    }
    public String update() {
        return NONE;
    }
    public String delete() {
        return NONE;
    }
}
  • 编写页面
<body>
    <a href="${pageContext.request.contextPath}/demo_saveAction.action" >保存</a>
    <a href="${pageContext.request.contextPath}/demo_addAction.action" >增加</a>
    <a href="${pageContext.request.contextPath}/demo_updateAction.action" >修改</a>
    <a href="${pageContext.request.contextPath}/demo_deleteAction.action" >删除</a>
</body>
  • 编写配置文件
<package name="demo" extends="struts-default" namespace="/">
    <action name="demo_*" class="cn.robin.demo.action.HelloAction"  method="{1}" />
</package>

2.动态方法访问

  • 动态方法访问在struts2默认是不打开的,需要进行配置
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
  • 编写Action
public class Demo extends ActionSupport {
    public String save() {
        return NONE;
    }
    public String add() {
        return NONE;
    }
    public String update() {
        return NONE;
    }
    public String delete() {
        return NONE;
    }
}
  • 编写配置文件
<package name="action" extends="struts-default" namespace="/">
    <action name="hello" class="cn.robin.demo.action.HelloAction"  />
</package>
  • 编写页面
<body>
    <a href="${pageContext.request.contextPath}/hello!save.action" >保存</a>
    <a href="${pageContext.request.contextPath}/hello!add.action" >增加</a>
    <a href="${pageContext.request.contextPath}/hello!update.action" >修改</a>
    <a href="${pageContext.request.contextPath}/hello!delete.action" >删除</a>
</body>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 本文包括: 1、Struts 2 概述2、Struts 2 快速入门3、Struts 2 的执行流程4、配置 st...
    廖少少阅读 2,946评论 3 13
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代产品,是在 struts1和WebWork的...
    inke阅读 2,236评论 0 50
  • 1、struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatch...
    重山杨阅读 1,511评论 0 38
  • 察觉到的负面情绪: 1.觉得自己看书东看西看,乱七八糟,不成一个体系,学不到多少知识,因此责备自己贪心,学习浮于表...
    独一味阅读 235评论 0 0
  • 今晚流氓兔推荐的歌曲是《约定》,周蕙。“你我约定一争吵很快要喊停”,就是这句歌词就足以成为我今晚最想听,最想推荐的...
    佐恬阅读 233评论 0 0