前言
现在开始学习三大框架的Structs2框架,学习一个新的语言或者工具自然要先向她问好了:HelloStruts2!问好也不能只是简单的syso一下,要学会对比,接下来我会对比一下Struts1和Struts2的不同,梳理一下Struts2的环境搭建以及完成简单的HolleWord项目,之后会对比Struts和Filter作为Controller的不同,以此对Struts2问好!
Struts2概述
Struts2 是一个用来开发 MVC 应用程序的框架. 它 提供了 Web 应用程序开发过程中的一些常见问题的解决方案:
- 对来自用户的输入数据进行合法性验证
- 统一的布局
- 可扩展性
- 国际化和本地化
- 支持 Ajax
- 表单的重复提交
- 文件的上传下载
- …..
Struts2 VS Struts1
Struts2 从本质上讲已不是从 Struts1 扩展而来的, 说它是一个换了品牌标签的 WebWork 更合适。
- Struts1 里使用 ActionServlet 作为控制器; Struts2 使用了一个过滤器作为控制器
- Struts1 中每个 HTML 表单都对应一个 ActionForm 实例. Struts2 中, HTML 表单将被直接映射到一个 POJO.
- Struts1 的验证逻辑编写在 ActionForm 中; Struts2 中的验证逻辑编写在 Action 中.
- Struts1 中, Action 类必须继承 org.apache.struts.action.Action 类; Struts2 中任何一个 POJO 都可以是一个 Action 类.
- Struts2 在页面里使用 OGNL 来显示各种对象模型, 可以不再使用 EL 和 JSTL
- 在体系结构方面更优秀:
类更少, 更高效: 在 Struts2 中无需使用 “ActionForm” 来封装请求参数.
扩展更容易: Struts2 通过拦截器完成了框架的大部分工作. 在 Struts2 中插入一个拦截器对象相当简便易行.
- 更容易测试:
即使不使用浏览器也可以对基于 Struts2 的应用进行测试。
Struts2的环境搭建
Struts2的下载
- 打开浏览器输入 https://struts.apache.org/download.cgi
- 选择一个Struts2的版本(这里下载的是Struts 2.3.34)
- 点击 “struts-2.3.34-all.zip” 下载
项目配置
- 解压struts-2.3.34-all.zip,找到目录下的struts2-blank.war
- 加入 jar 包: 复制 struts\apps\struts2-blank\WEB-INF\lib 下的所有 jar 包到当前 web 应用的 lib 目录下.
- 在 web.xml 文件中配置 struts2: 复制 struts\apps\struts2-blank1\WEB-INF\web.xml 文件中的过滤器的配置到当前 web 应用的 web.xml 文件中
- 在当前 web 应用的 classpath 下添加 struts2 的配置文件 struts.xml: 复制 struts1\apps\struts2-blank\WEB-INF\classes 下的 struts.xml 文件到当前 web 应用的 src 目录下.
HelloStruts2
具体项目源码请参考我的GitHub
需求和目录
编写jsp和POJO
index.jsp
只包含一个超链接
<body> <a href="product-input.action"> Product Input</a> </body>
input.jsp
一个简单的表单
<body> <form action="product-save.action" method="post"> 表单1:<input type="text" name="fname"> <br> <br> 表单2:<input type="password" name="fage"> <br> <br> <br> 表单3:<input type="text" name="fsex"> <br> <br> <input type="submit" value="提交"> </form> </body>
details.jsp
EL输出
<body> 姓名: ${fname} 性别:${fsex} 年龄:${fage} </body>
Product.java
类的封装
package cn.llanc.HolleWord; public class Product { String fname; String fage; String fsex; public String getFname() { return fname; } public void setFname(String fname) { this.fname = fname; } public String getFage() { return fage; } public void setFage(String fage) { this.fage = fage; } public String getFsex() { return fsex; } public void setFsex(String fsex) { this.fsex = fsex; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Product [fname=" + fname + ", fage=" + fage + ", fsex=" + fsex + ", getFname()=" + getFname() + ", getFage()=" + getFage() + ", getFsex()=" + getFsex() +"]"; } public String save() { System.out.println("Save"+this); return "details"; } }
web.xml和struts.xml的配置
web.xml
参考 项目配置 中的第三条,实际是配置一个过滤器以拦截所以的请求,这个Filter的名字就是StrutsPrepareAndExecuteFilter
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts2-learn-2</display-name> <!-- struts2的filter --> <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.jsp</welcome-file> </welcome-file-list> </web-app>
struts.xml
struts.xml中关于请求的配置要写在<package>标签中(用于组织模块)。
每个<package>标签要有一个name 和 extend(一般继承struts-default,位于struts2-core-2.3.34.jar下的struts-default.xml中的名为struts-default的<package>)。
在package下配置子节点<action>,<action>也有个那么属性(属性值即为struts2请求的名字但是不包含其拓展名)或有个ServletPath(去除/和拓展名)。<action>下有子节点<result>
详细说明参考以下代码:
<?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> <!-- package: 包. struts2 使用 package 来组织模块. name 属性: 必须. 用于其它的包应用当前包. extends: 当前包继承哪个包, 继承的, 即可以继承其中的所有的配置. 通常情况下继承 struts-default struts-default 这个包在 struts-default.xml 文件中定义. namespace 可选, 如果它没有给出, 则以 / 为默认值. 若 namespace 有一个非默认值, 则要想调用这个包里的Action, 就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里 http://localhost:8080/contextPath/namespace/actionName.action --> <package name="HellowWord" extends="struts-default"> <!-- 配置一个 action: 一个 struts2 的请求就是一个 action name: 对应一个 struts2 的请求的名字(或对一个 servletPath, 但去除 / 和扩展名), 不包含扩展名 class 的默认值为: com.opensymphony.xwork2.ActionSupport method 的默认值为: execute result: 结果. --> <action name="product-input"> <result>/WEB-INF/pages/input.jsp</result> </action> <action name="product-save" class="cn.llanc.HolleWord.Product" method="save"> <!-- result: 结果. 表示 action 方法执行后可能返回的一个结果. 所以一个 action 节点可能会有多个 result 子节点. 多个 result 子节点使用 name 来区分 name: 标识一个 result. 和 action 方法的返回值对应. 默认值为 success type: 表示结果的类型. 默认值为 dispatcher(转发到结果.) --> <result name="details">/WEB-INF/pages/details.jsp</result> </action> </package> </struts>
Struts2请求相应过程
使用Struts2实现HolleWord VS 使用Filter实现HolleWord
使用Filter实现HolleWord
jsp页面基本与上相同只是details.jsp的EL输出要加上请求域和对象,如:${requestScope.Product.fname}
另外不需要XML的配置,但需要一个Filter:
FilterDispathcher.java:
在doFilter方法中处理请求
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); HttpServletRequest req=(HttpServletRequest)request; response.setContentType("text/html;charset=utf-8"); String servletPath=req.getServletPath(); String path=null;//要转发的地址 if("/product-input.action".equals(servletPath)) { path="/WEB-INF/pages/input.jsp"; }else if ("/product-save.action".equals(servletPath)) { String fname= request.getParameter("fname"); String fage= request.getParameter("fage"); String fsex= request.getParameter("fsex"); Product product=new Product(fname, fage, fsex); request.setAttribute("Product", product); path="/WEB-INF/pages/detais.jsp"; } System.out.println(path); if(path!=null){ request.getRequestDispatcher(path).forward(request, response);//请求转发 return; } chain.doFilter(request, response); }
struts2优势
- 大量减少了代码。
- 不需要显式的定义 Filter, 而使用的是 struts2 的配置文件。
- details.jsp 比先前变得简单了。
- 请求处理模块化,结构清晰。
小结
Struts2框架作为一个优秀的MVC模式框架,很值得深入学习和掌握。作为我学习的三大框架的第一个,我相信,掌握它会给我以后的学习和工作带来非常大的帮助!
博观而约取,厚积而薄发。
评论前必须登录!
注册