1.namespace、action实现、路径问题(我的struts2笔记)

这里主要内容是:

  • struts2入门
  • namespace
  • action实现
  • 路径问题

一、struts2入门

这里我们使用的是struts2的2.3.24版本。

1.新建一个web工程(Struts2_0100_Introduction)

2.将struts-2.3.24.1\apps\struts2-blank.war解压出来,从这个例子工程中我们可以得到最少量的依赖包和相关的配置文件(struts.xmlweb.xml

3.对配置文件进行相应的修改
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>
    <!-- <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <global-results>
            <result name="error">/WEB-INF/jsp/error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>
        <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
    </package>
    <include file="example.xml"/> -->
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/" extends="struts-default">
        <action name="hello">
            <result>
                /hello.jsp
            </result>
        </action>
    </package>

</struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Struts2_0100_Introduction</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <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>

hello.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Hello World</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
  
  <body>
    Hello Struts2<br>
  </body>
</html>

然后我们将此工程部署到服务器中,使用地址http://localhost:8080/Struts2_0100_Introduction/hello进行访问。

注意:web.xml中最基本的配置就是配置struts2的过滤器,也就是StrutsPrepareAndExecuteFilter。同时映射地址一般为"/*",表示映射所有。

说明:这是一个最基本的struts2工程,下面我们将依次说明其中的各个配置标签等内容。

二、namespace(工程Struts2_0200_Namespace

下面我们先给出相关的工程文件(没有给出的表示和之前的一样),之后再详细说明(有些说明直接写在了文件中)
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>
    <constant name="struts.devMode" value="true" />
    <package name="front" namespace="/front" extends="struts-default">
        <action name="index">
            <result>
                /namespace.jsp
            </result>
        </action>
    </package>
    <package name="main" extends="struts-default" namespace="">
        <action name="index">
            <result>/namespace.jsp</result>
        </action>
    </package>

</struts>

namespace.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>namespace</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
  
  <body>
    some information<br>
  </body>
</html>

说明:
1.package用于打包,以便于和别的包进行区分,比如上面两个包中都有index这个action,这时我们需要进行区分。

2.namespace决定了之后我们的访问路径,默认是为空的(" "),这是我们可以使用http://localhost:8080/struts2_0200_Namespace/xxx/xxx/index或者其他随便什么地址进行访问(即xxx可以是任意的),只要最后是index即可,都可以访问到其下面配置的action。一般用于覆盖其他特定路径没有涵盖到的路径。而上面所说的打包中有多个同名的action也是通过namespace进行区分访问的。

当然我们有时候会将namespace配置为特定的值,如同例子中的/front一样。这时就必须使用地址http://localhost:8080/struts2_0200_Namespace/front/index进行访问了。而如果是"/",则必须使用http://localhost:8080/struts2_0200_Namespace/index进行访问。

三、action实现(工程Struts2_0300_Action

这里我们先给出响应的代码,在后面进行详细说明。这里不再给出jsp文件,我们可以随便写点什么都行。
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>
    <constant name="struts.devMode" value="true" />
    <package name="front" namespace="/" extends="struts-default">
        <action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
            <result name="success">
                /ActionIntroduction.jsp
            </result>
        </action>
    </package>
</struts>

这里给出的action是IndexAction1,对于其他几个action类的试验只需要在这里将名字换掉即可。

IndexAction1.java

package com.bjsxt.struts2.front.action;
public class IndexAction1 {
    public String execute(){
        return "success";
    }
}

IndexAction2.java

package com.bjsxt.struts2.front.action;
import com.opensymphony.xwork2.Action;
public class IndexAction2 implements Action {
    @Override
    public String execute() throws Exception {
        return "success";
    }
}

IndexAction3.java

package com.bjsxt.struts2.front.action;
import com.opensymphony.xwork2.ActionSupport;
public class IndexAction3 extends ActionSupport {

    @Override
    public String execute() throws Exception {
        return "success";
    }
    
}

说明:
1.struts.xml中我们可以看到我们配了一个name="success",这就表示成功的时候调用哪个jsp,这是默认的,可以不配。

2.对于action,在struts2中所有的action都只是一个普通的java类,只要里面有public String execute()方法即可。对于第一个action,我们看到给出了一个默认的execute方法,然后返回值是String类型就可以了。但是我们会发现这种方式针对每个功能都需要我们手动定义实现一个方法,很麻烦。所以这种方式一般不用,当然要用也是可以的。

3.对于第二个action,我们看到实现了Action接口,然后实现了一个默认的execute方法,但是我们会发现这种方式同样麻烦,因为虽然struts都帮我们定义好了方法,但是这些方法却都需要我们自己手动实现。

4.这里我们一般使用第三个Action这种方式,即继承ActionSupport类,这个类帮我们实现好了各个方法,拿过来用即可。

四、路径问题(工程Struts2_0400_Path

同样,我们还是先给出相关代码,后面再详细说明。
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Struts2_0400_Path</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <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>

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>
    <constant name="struts.devMode" value="true" />
    <package name="path" namespace="/path" extends="struts-default">
        <action name="path" class="com.bjsxt.struts2.path.action.PathAction">
            <result name="path">
                /path.jsp
            </result>
        </action>
    </package>
</struts>

PathAction.java

package com.bjsxt.struts2.path.action;
public class PathAction {
    public String execute(){
        return "path";
    }
}

path.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <!-- 试验的时候先不加下面这行 -->
    <base href="${pageContext.request.contextPath}/"/>
    <title>path</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
  
  <body>
    <a href="index.jsp">index.jsp</a>
  </body>
</html>

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>path</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
  <body>
    <a href="path/path.action">路径问题说明</a>
  </body>
</html>

说明:
1.当我们使用地址http://localhost:8080/Struts2_0400_Path/访问的时候,这里是直接访问根路径。首先会去web.xml中找到过滤器。然后去找对应的namespace,这里地址中的namespace是一个"/",但是在struts.xml中找的时候却发现没有对应的namespace,于是就交给tomcat处理,使用默认页面index.jsp

2.在index.jsp页面中我们的超链接地址是http://localhost:8080/Struts2_0400_Path/path/path.action,于是就去找对应的namespace="path"和名字为path的action。于是找到了对应的类,类中我们返回一个字符串path,于是在struts.xml中找到结果是"path"的result。于是调用path.jsp

3.在path.jsp中如果没有<base href="${pageContext.request.contextPath}/"/>,当我们点击path.jsp页面中的链接时发现访问不到资源,而且点击后的地址是http://localhost:8080/Struts2_0400_Path/path/index.jsp。照理说,index.jsppath.jsp是在同一个目录下,是可以使用相对路径访问的,但是这里为什么不能呢,地址也不正确?这是因为struts2中路径问题是根据action的路径而不是jsp的路径来确定的,所以尽量不要使用相对路径,而使用绝对路径。这里取得绝对路径的一个好办法是配置<base href="${pageContext.request.contextPath}/"/>,注意:此时我们在超链接中就可以使用index.jsp了,base标签帮我们确定了本页面绝对路径的前面一段,我们只需要配置后面一段即可。同时注意base地址中最后的"/"不要丢了。不要使用MyEclipse中生成的那种路径方法,我们不能让jsp页面中出现java代码。

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

推荐阅读更多精彩内容

  • 概述 Struts就是基于mvc模式的框架!(struts其实也是servlet封装,提高开发效率!) Strut...
    奋斗的老王阅读 2,920评论 0 51
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代产品,是在 struts1和WebWork的...
    inke阅读 2,242评论 0 50
  • 详谈 Struts2 的核心概念 本文将深入探讨Struts2 的核心概念,首先介绍的是Struts2 的体系结构...
    可爱傻妞是我的爱阅读 1,112评论 0 2
  • 本文包括: 1、Struts 2 概述2、Struts 2 快速入门3、Struts 2 的执行流程4、配置 st...
    廖少少阅读 2,949评论 3 13
  • 那条路 形单影只 那片美 独赏无喜 朦胧 身影从眼前消失 你 在哪儿? 梦中 你的回眸 黯淡了星辰 温暖了我心 那...
    bearfly阅读 315评论 3 5