struts中package元素的namespace属性几乎在所有的项目中都会使用到,开始总是不知道怎么用,后来在百度了一下,找到了一些解法,但是我自己尝试的时候却不能成功。后来我自己在他们的基础上做了些改动,发现能用了。本文基本上和网上的相同,但是改了一些内容,因为按照网上的解法我不能成功。
其间涉及到4个文件:struts.xml配置文件、test.jsp页面、testSuccess.html页面以及TestNSAction.java(test.jsp和testSuccess.html两个文件在WebRoot/nameSpace目录下)。
testSuccess.html
<html> <head> <title>testSuccess</title> </head> <body> test Success... </body> </html>
TestNSAction.java
public class TestNSAction extends ActionSupport { @Override public String execute() throws Exception { return SUCCESS; } }
方法一(看张龙老师的视频学习到的):
<struts> <package name="testNS" extends="struts-default" namespace="/nameSpace"> <action name="test" class="com.kqygww.action.TestNSAction"> <result type="success">testSuccess.html</result> </action> </package> </struts>
test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>test</title> </head> <body> <form action="test.action"> <input type="submit" value="submit" /> </form> </body> </html>
方法二(来自于方法一):
同样首先是struts.xml,同上的主要区别在于namespace的属性值与文件夹不同名,我用的是"/ns"。
而test.jsp中当然也需相应的改动,与上面的区别是action值,现为"/struts2/ns/test.action"(分别代表的是Context path、namespace属性值、最终的action名)。从第一种方法的分析可知,这里action的值中前面有加”/“符号,故为”服务路径“(http://localhost:8080),加上action值。得http://localhost:8080/struts2/ns/test.action。此为正确的URL。在struts.xml文件中也要改文件的访问路径。
struts.xml
<struts> <package name="testNS" extends="struts-default" namespace="/ns"> <action name="test" class="com.kqygww.action.TestNSAction"> <result type="success">/nameSpace/testSuccess.html</result> </action> </package> </struts>
test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>test</title> </head> <body> <form action="/struts2/ns/test.action"> <input type="submit" value="submit" /> </form> </body> </html>
方法三(来自于方法二):
struts.xml与方法二中的一样。
在test.jsp求URL的方法上,略有不同。需在test.jsp的<head>与<title>标签之间添加代码<base href="<%=basePath%>">。当添加此base标签之后,计算URL的方法就有所变化,添加之后,在此例中action的值就需改为"ns/test.action”(分别代表的是namespace属性值、最终的action名)。因为当添加base标签之后,URL就是以base为相对路径,从test.jsp顶部的JSP代码中的path和basePath可知,此时的base值为http://localhost:8080/struts2/。因此从第二种方法中正确的URL可知,我们只需将action值写为"ns/test.action”就行,因为base中只缺此部分。
test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <html> <head> <base href="<%=basePath%>"> <title>test</title> </head> <body> <form action="ns/test"> <input type="submit" value="submit" /> </form> </body> </html>
推荐使用方法一,方法一更简单直观,更好管理。