初次使用Struts2/入门
步骤:
1.下载jar包
其他所需要的jar包:
- commons-fileupload.jar:文件上传组件
- commons-io是一款处理io流的工具,封装了很多处理io流和文件的方法,可以大大简化我们处理io流和操作文件的代码
- commons-lang3跟java.lang这个包的作用类似,Commons
Lang这一组API也是提供一些基础的、通用的操作和处理,如自动生成toString()的结果、自动实现hashCode()和equals()方法、数组操作、枚举、日期和时间的处理等等。 - freemarker-2.3.26.jar:struts2的UI标签的模板使用FreeMaker编写
- Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。
- Log4j 是Apache为Java提供的日志管理工具。他与System.out.println()的作用相似,用来跟踪、调试、维护程序。
- ognl.jar:对象图导航语言(struts2通过ognl读写对象的属性)
- struts2的核心类库
如图:
2.引用至本地项目
-
准备好了上面所有的jar包之后,我们把这些jar包导入到自己的项目中去
如图:
3.新建source folder 放入struts.xml 配置web.xml
- 如图:
-
web.xml代码:
<display-name>Struts Blank</display-name> <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> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>
struts代码:
<struts>
<!-- consant 常量,struts.devMode表示开发者模式,当为true时如果改变了其中的一些代码,可以不用重新启动tomcat-->
<constant name="struts.devMode" value="true" />
<!--package可以有多个解决重名的情况, namespace 可以不写,默认是如何路径都可以,也可以写成/xx/yy ,必须是/开头-->
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
<!-- action里面那个name属性值得是URL输入的路径名 ,如“http://localhost:8080/Struts2Demo/hello”,则会根据result反馈Hello.jsp-->
<action name="hello" class="com.styspace.struts2.action.action2">
<result> /Hello.jsp</result>
</action>
<!-- action里面class属性值,会有对应的这个类,执行该类里面的execute()方法-->
<action name="action" class="com.styspace.struts2.action.action2">
<result name="success">/Action.jsp</result>
</action>
<!-- action里面method属性值,会有对应class这个类中的add方法,然后执行该方法-->
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
<!-- 一般action里面不用method属性值,而是用DMI(动态方法调用)可以通过http://localhost:8080/Struts2Demo/user!addURL调用,其中user指的是action中的name值-->
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
<!-- 更简单的方法,通配符,name=“student*”会匹配URL中所有Studentxx,而method=“{1}”指的是name中第一个“*”匹配的值 同理,result中{1}也是一样的-->
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<!-- 甚至可以有多个通配符,class属性中也可以用{1}来匹配,最简化-->
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
<!-- Add packages here -->
</struts>
4.新建一个子控制器
-
列如:一个名为HelloAction的子控制器
private String result; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String execute() { System.out.println("滑稽"); return "rs"; } }
-
struts配置:
- jsp跳转:
工作原理:
-
在浏览器中输入http://localhost:8080/Struts2Demo/hello,就会向服务器端(tomcat)发送一个请求
-
tomcat会解析URL,从中找到一个webApplication(可理解为即项目名)为Struts2Demo,然后就会在这个项目里面找到web.xml文件
-
在web.xml中找到filter标签,然后在filter中定义的filter-class处理URL中的hello(这其中其实还包含一个步骤,就是web.xml中/*会过滤掉所有地址,这样地址才会被filter-class中定义的类接收到)
-
StrutsPrepareAndExecuteFilter接收到地址之后,首先查询namespace(在struts.xml中的package标签中的namespace中得到它的值),然后将URL中namespace值(这里是/)后面的路径读取到(这里是hello)
-
继续在struts的action标签中查找是否有hello这个值的,如果有且发现action中有class属性,则会new一个class中声明的类,执行里面的一个execute()方法,该方法返回一个String字符串,返回该字符串之后才能得到result中的值,如果action中没有class属性,则默认有一个ActionSupport类,该类中也有一个execute方法,返回一个String值
-
上一步中讲到execute()方法,但是不一定非要执行execute()方法,当action标签中有method属性时,就会执行该属性定义的方法名称,然后同样会返回一个String字符串
-
根据返回的String字符串(success),在result中找到name属性值为返回的String字符串的标签(这里就是Action.jsp),如果没有找到,则会返回error页面;如果action中没有class则直接找到该action下面的result中的值(这里是/Hello.jsp),然后将请求forword到Action.jsp/Hello.jsp
-
最后jsp反馈到客户端。
jsp展示结果:
初步使用建立一个Hello Word页面完成了
如果你在struts.xml标签校验失败没有提示怎么办?
Look!看下面
- 首先在Libraries下面找到 struts2.5.dtd
- 然后在本地新建一个struts2.5.dtd(代码使用高级记事本copy进去就可以了)
3.进入window→preference→输入xml
4.点击add会出现这个界面
- 先选中本地我们新建的dtd文件,然后输入uri,然后我们回到struts.xml里就会出现提示了
结果:
XML Catalog 原理
XML Catalog 提供了一种重新定位资源的机制,可以将 xml 引用的 artifacts,包括 URI 地址以及 namespace 名重新定位到另一个地址。通常这种机制被用来将远程的引用资源重定位到本地或者 web。XML catalog 就是一个描述外部实体引用和本地缓存的相同实体的映射的文件。
在实际的开发生产中,xml 文件经常会引用外部的文件,这些文件通常通过 URI 表示,其中以 URL 应用最广。但是如果是绝对的 URL, 那么只有当你的网络能够访问它时才能起作用,如果网络出现问题,那么将不能访问。当是相对 URL 时,例如"…/…/xml/dtd/docbookx.xml",只有当你的文件系统和定义者一致的时候才能起作用。
一种解决办法就是通过实体解析器(Entity Resolver)或者是 URI 解析器 (URI Resolver ),解析器可以通过检查资源的 URI 来定位资源。 用户通过配置 xml catalog, 手动的指定 xml 文件引用的 xsd 文件的本地地址,URI 解析器通过 xml catalog 里面的映射,找到对应的 xsd, 最后 xml catalog 处理器通过解析器找到的 xsd 对 xml 进行校验。
通俗点说,XML catalog 通过命名空间将 xml 文件及其对应的 xsd 文件联系起来,并通过解析器定位 xsd 文件的位置,最后通过处理器进行校验。
与 javax.xml.validation 通过 xsd 对 xml 进行校验的方法不同,xml catalog 可以通过 Namespace 来校验所有引用这个 xsd 的 xml 文件,从而达到批量校验的效果。例如,a.xml,b.xml,c.xml 都是由 d.xsd 校验,那么只要将 d.xsd 的命名空间配置好,通过该命名空间就可以校验以上三个文件了。
5.参数赋值方法
-
赋值方法分为三种:
1.在Action内为某一属性提供set/get方法
2.implements ModelDriven接口客户端页面的值会通过反射赋值
3.对象导航赋值
这里是用对象实例的name.属性
-
对象导航需要对对象进行封装