顿搜
Struts2相关知识简介
一、背景
1、由Struts1和WebWork框架整合而来
2、WebWork采用拦截器机制处理用户请求,使得业务逻辑控制器与servlet完全脱离开
3、实现了MVC开发模式,解除了与Servlet的强耦合性
二、框架的好处
1、属性驱动:表单中的数据不用通过request.getParameter()得到,可以直接使用
2、模型驱动:提交的表单数据自动封装到相对应的实体类对象当中
3、上传功能:便捷实现上传功能FileUpload,只需简单的配置一下文件即可
4、国际化:可以很方便的实现国际化,只需要简单的配置好语言间的关系
5、校验器:通过配置即可方便的完成表单的后台校验
6、强大的标签库:包括Struts标签库和OGNL标签库,也可以使用EL表达式和JSTL标签
7、管理更科学:可以使用XML管理程序文件的对应关系
8、安全的线程机制:每个Action都是独立的。 Servlet是 单例模式,所以线程是不安全的。
9、Token令牌机制:防止数据重复提交。
9、异常处理机制:通过配置即可完成。
10、面向切面编程(AOP):先进的编程思路,拦截器的使用包括自动封装、上传文件、数据校验
三、JAR包结构
1、三个asm :反射的替代方案,是java字节码操控框架,能动态的生成和改造java代码
2、commons-fileupload:上传文件的jar包
3、commons-io:对文件流操作的工具包
4、commons-lang:基础文件包
5、commons-logging:日志包
6、freemarker:生成各种文本
7、javassist:是java字节码操纵更加简便,编译java字节码的类库
8、log4j:日志
9、ognl:struts2独有的标签库
10:struts2-core:核心包
11:xwork-core:webwork的包
四、WEB.XML文件配置
<?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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</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是Struts2默认行为标签,用于改变Struts2默认配置-->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!--默认Struts2的请求后缀是.action,若不配置该元素,默认只会拦截.action的请求-->
<constant name="struts.action.extension" value="do,,"/>
<!--开发模式下可以打印出详细的错误信息-->
<constant name="struts.devMode" value="true" />
<!--配置web默认编码集,相当于HttpServletRequest.setChartacterEncoding用法-->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!--设置浏览器是否缓存静态内容,默认为true,开发阶段建议关闭-->
<constant name="struts.serve.static.browserCache" value="false"/>
<!--Struts2配置文件修改后,是否自动重新加载该文件,默认为false-->
<constant name="struts.configuration.xml.reload" value="true"/>
<!--默认视图主题,如input标签的样式,使样式不受struts标签的影响-->
<constant name="struts.ui.theme" value="simple"/>
<constant name="struts.ui.templateDir" value="template"/>
<constant name="struts.ui.templateSuffix" value="ftl"/>
<!--该标签用于引入其它的xml配置文件-->
<include file=""></include>
<!--包标签,用于区分不同的请求文件-->
<!--name属性:包名,用于被别的包调用或继承-->
<!--extends:继承哪个包,会继承该包下配置信息和拦截器等等-->
<!--namespace:选填-->
<package name="default" extends="struts-default" namespace="/" >
<default-action-ref name="testAction1" />
<!-- 使用通配符配置action的各个方法,action相当于servlet的概念,对应一个请求 -->
<!--name为请求的url地址-->
<action name="user_*" class="userAction" method="{1}" >
<!--返回的结果页-->
<result>/index.jsp</result>
<result name="input" >/err.jsp</result>
<result name="load">/load.jsp</result>
<result name="list">/list.jsp</result>
<result name="list_load" type="redirectAction">
<param name="namespace">/</param>
<param name="actionName">user_list</param>
<param name="page">${page}</param>
<param name="pageSize">${pageSize}</param>
<param name="msg">${msg}</param>
</result>
<result name="modify" type="redirectAction">
<param name="namespace">/</param>
<param name="actionName">user_load</param>
<param name="uids">${user.id}</param>
</result>
<result name="addUser">/add.jsp</result>
<result name="check">/my.jsp</result>
<result name="no">/customer/login.jsp</result>
<result name="center">/my.jsp</result>
</action>
<action name="index_*" class="indexAction" method="{1}">
<result>/customer/index.jsp</result>
<result name="group">/customer/group.jsp</result>
<result name="input" >/err.jsp</result>
<result name = "more">/customer/more.jsp</result>
<result name = "play">/customer/player.jsp</result>
<!--如果使用模型驱动,action类需要继承ModelDriver。以下加入模型驱动的拦截器-->
<interceptor-ref name="modelDriven"/>
<!--系统默认的拦截器-->
<interceptor-ref name="default"/>
</action>
</package>
</struts>六、数据封装
- 1、属性驱动:需要在action中编写表单name中的所有属性并设置访问器和修改器,不需要模型类。
- 2、模型驱动:action类需要继承ModelDriver<>,需要创建模型对象的实例m,需要实现getModel方法,返回模型对象m。使用时需要用模型对象名m.get来得到属性的值。
- 3、标签实现模型驱动:需要定义模型对象m,不用实例化,使用时需要用模型对象名m.get来得到属性的值。jsp中需要引入标签库。
<%@taglib prefix = "s" uri="/struts-tags"%>
<s:form namespace = "" action="test" method="post">
模型名:<s:textfield name="m.testName" />
<s:submit value="提交"/>
</s:from>注:使用<s:form >时,action中不要写全路径,写上action名字即可。标签结束处直接加"/"即可,否侧可能报错