- 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的精力放到业务需求的分析和理解上面。
- 特点:封装了很多细节,程序员在使用的时候会非常简单。
- Longlong ago,有三大框架struts、hibernate、spring(SSH)
- springmvc、mybatis、spring(SSM)
Struts2的来历
- Struts1:
- Struts1也是apache开发的一套mvc的开源框架。在2005年之前非常流行。
- 弊端:Struts1的核心控制器就是一个Servlet。随着使用者的增多,弊端开始出现。
- Struts2:
- 在long long ago,有一个设计超前的框架XWork,后来推出了XWork1和WebWork2。
- Struts2就是apache和OpenSymphony组织合并开发出来。
- 里面包含了WebWork2的核心及Struts的一些特性和功能。除此之外,和Struts1没有任何关系了
一 Struts2框架部署
- 加载-Struts2基础jar包
文件名 | 描述 |
Struts2-core-xxx.jar | Struts2核心框架类库 |
Xwork-core-xxx.jar | xwork类库Struts2的基础构架 |
Ognl-xxx.jar | 使用的一种表达式语言类库 |
Freemarker-xxx.jar | 标签模板使用类库 |
Commons-fileupload-xxx.jar | 文件上传时进行处理 |
Commons-io-xxx.jar | Java-io类扩展 |
Commons-lang-xxx.jar | 包含数据类型工具类 |
Javassist-xxx.GA.jar | 对字节码进行处理 |
asm-3.3.jar | 基于子类的动态代理 |
asm-tree-3.3.jar | 提供其于对象的表现形式 |
asm-commons-3.3.jar | 提供基于事件的表现形式 |
- 下载Struts2开发包 http://struts.apache.org
- 创建项目导入jar包
- 创建一个Web工程,名为day1WEB项目
- 把struts2-blank.war中的lib下所有的包导入创建的工程web-inf的lib下
- 添加配置文件
1、配置Web.Xm文件核心过滤器 ,一般固定写法
<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>
|
2、把struts2-blank的classes目录下struts.xml配置文件copy工程的src下<!-- -->注释的代码可以不添加
<?xml version="1.0" encoding="UTF-8" ?> <!-- 常量配置 <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> --> <!-- 可以创建多个package,但是名称不能相同! --> <package name="default" namespace="/" extends="struts-default"> <!-- 默认的action名称 <default-action-ref name="index" /> --> <!-- 全局的结果集:针对于所有的action都是适用的 <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中没有指定具体的class内容, 则默认指定就是: ActionSupport类 --> <action name="inputdemo" class="com.action.UserAction"> <result name="ok">/mvc/input1.jsp</result> <!-- <result type="redirectAction"> <param name="actionName">HelloWorld</param> <param name="namespace">/example</param> </result> --> </action> <!-- 执行指定的方法 --> <action name="input" class="com.action.UserAction" method="add"> <result name="add">/mvc/input1.jsp</result> </action> <!-- 动态方法 --> <action name="input_*" class="com.action.UserAction" method="{1}"> <result name="{1}">/mvc/input1.jsp</result> </action> </package> <!-- 当配置文件内容很多的情况,可以创建多个配置文件,分别配置, 然后再来包含到一个总文件中--> <include file="servlet.xml"/> </struts> |
4、编写action类方法
1、Src下创建com.action包新建 XXXAction的类,action会默认继承ActionSupport类
public class UserAction extends ActionSupport{ private String uid; private String uname; private String upass; public UserAction() { super(); } //相当于就是Servlet中的doGet(),doPost(),service()方法 @Override //默认执行的方法 public String execute() throws Exception { String res=null; //处理语句 System.out.println("----运行Use--execute()方法----"); res="ok"; return res; } } |
5、编写WEB jsp 页面
<h2>方式1:</h2> <!-- Struts2中的请求路径的默认扩展名为: .action --> <h2><a href="inputdemo.action?uname=lisi">进入</a></h2> <h2>方式2:</h2> <form action="inputdemo.action" method="post" > 用户名: <input type="text" name="uname"/> <br><input type="submit" value="提交"/> </from> |
6、访问项目路径
- 浏览器访问下面三个路径
- http://localhost:8080/day1WEB/input1【能正常访问】
- http://localhost:8080/day1WEB/input1.action 【也能正常访问】
- http://localhost:8080/day1WEB/input1.xxx【不能正确访问】
- 因为struts默认是处理.action的请求,或者不带action也可以,其它后缀的都不会拦截,会放行,如jsp
二 Struts2详细配置介绍
- Struts.xml无提示解决方法
- 如果struts里没有标签提示
- 第一种解决办法是电脑联网,会自动搜索struts的dtd
- 第二种解决办法配置本地dtd,打开preference,安装下面的步骤操作即可
- struts-2.3.dtd文件可以从struts2-core-2.3.33.jar包内找到
- 查看Struts的文档
- 目标:查找struts的架构图及内部
- 在线文件:http://struts.apache.org/core-developers/big-picture
- 离线文档:struts-2.3.33 /docs/docs/home.html
- 打开上面两个连接后,然后查找guides -> bigPictrue执行过程
- 注:User created标识的是以后我们经常要写的
- Struts2加载顺序
顺序 | 配置文件名 | 所在位置 | 说明 |
1 | default.properties | struts2-core-2.3.15.3.jar\org\apache\struts2 | 不能修改 |
2 | struts-default.xml | struts2-core-2.3.15.3.jar | 不能修改 |
3 | strtuts-plugin.xml | 在struts2提供的插件jar包中 | 不能修改 |
4 | struts.xml | 我们的应用中 | 可以修改的:推荐 |
5 | struts.properties | 我们的应用中 | 可以修改的 |
6 | web.xml | 我们的应用中 | 可以修改的,可以给过滤器配置参数 |
- default.properties的默认配置
struts.i18n.encoding=UTF-8 | 国际化 |
struts.action.extension=action,, | 默认访问扩展后缀,可以是action,也可以没有后续 |
struts.devMode = false | 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。 |
5、配置文件主要元素
- Package元素 分包管理动作类,便于模块化开发动作类
name | 包的名称。必须写。且必须唯一。 |
extends |
|
abstract | 把包声明为抽象包,抽象包就是用来被继承的。 只要是没有<action>元素的包,就可以声明为抽象包。 |
namespace | 名称空间。【访问路径=名称空间+动作名称】,一般用于模块划分mo |
- namespace元素 需要在访问action前添加红色命令空间,默认值不是/,写自定义的namespace时需要加/
- Action 元素 配置动作,处理请求路径
name:动作名称, 注意名称不要写 /
class:动作类全名。
method:动作类中的方法名称。默认是execute , 返回success
方法的要求: public的 、返回值必须是String 、没有参数
三种配置方法
1、直接在写个Action类,不需要继承任何类,然后在struts.xml中配置
2、写个Action类实现Action接口,然后实现excute方法
3、action继承ActionSupport、实现Action接口的类, 默认访问父类的execute()
- Result 元素 为动作指定结果视图
name:逻辑视图的名称,对应着动作方法的返回值。默认值是success
type:结果类型,指的就是用什么方式转到定义的页面。
dispatcher | (默认值)使用请求转发,转向一个页面。 |
redirect | 使用重定向,转向一个页面。 |
chain | 转发到另一个相同名称空间的动作: 动作的请求路径不用写/ 转发到不同名称空间的动作 |
redirectAction | 重定向到另一个相同名称空间的动作 重定向到不同名称空间的动作 |
6、默认动作类
struts.xml:可以在Action中不配置 class 和method,会由默认的动作类来处理,ActionSupport的excute方法返回的就是success |
|
- 全局视图&&局部视图
- 前面的自定义结果类型的写法是局部视图,其它包是不能访问的
- 全局视图的配置
第一步:写一个包,名为myDefault,里面写全局的配置
第二点:其它包继承myDefault包,如图
三 访问servletAPI&接收pram
- 解耦方式访问方法
-
- 第1、使用Map<k,v>集合将serlvet内置对象存放集合,获取 ActionConnext类的域对
-
Map<String ,Object> session=ActionContext.getContext().getSession(); Map<String, Object> request=(Map<String,Object>)ActionContext.getContext().get("request"); Map<String, Object>application=ActionContext.getContext().getApplication(); |
-
-
- 第2:通过实现接口方法:先让Action实现三个接RequestAware,ResponseAware,ApplictionAware
-
- 耦合方式访问方法
-
- 第一种:通过ServletActionContext的getConnext()方法获取 【推荐使用】
-
HttpServletRequest request=ServletActionContext.getRequest(); HttpServletResponse response=ServletActionContext.getResponse(); |
-
-
- 第二种:通过注入方式:先让Action实现两个接口ServletRequestAware,ServletResponseAware
-
- 参数注入原理
- 参数会自动注入是因为有两个拦截器在工作
- 查看struts-default.xml源码可以看到下面两个拦截器
- <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
- <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
四 拦截器详解
1、拦截器的重要性
- Struts2中的很多功能都是由拦截器完成的。比如:servletConfig,staticParam,params,modelDriven等等。
- Struts默认的拦截器配置在struts-default.xml文件中
- 拦截器是AOP编程思想的一种应用形式。
拦截器的应用场景【登录】
- 首先准备四个login.jsp,main.jsp, studentList.jsp, teacherList.jsp 页面
- 当登录成功后,跳转到main.jsp,main.jsp的内容可以跳转到学生和老师列表
|
如果没有登录,直接访问http://localhost:8080/day03_struts2_demo04/teacherList.action会回到登录页面 |
五 国际化详解
- 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据
- 例如:消息提示,错误提示和菜单,导航栏等等固定文本。
- 国际化组件加入
1、创建消息资源包
- 一个资源包由多个文件组成,这些文件名都有命名规范:主要文件名_语言代码_国家代码.properties
- 言代码和国家代码:有iso规定的
- 当文件只有主要文件名.properties时,表明它是默认资源包。浏览器会根据不同的语言环境找对应语言环境的资源包
- 每个资源包的内容都由相同的key和对应语言环境的value组成。比如:
- message_zh_CN.properties
- message_zh_HK.properties
- message_en_US.properties
2、读取消息资源内容
- Java提供ResourceBundle类可以读取资源包的国际化配置文件
3、jsp使用国际化
- 使用jstl标签国际化
- JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
- JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。
- 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
- struts提供的国际化
- 配置资源包
A 局部资源
- 资源包名称命名规范:package_语言代码_国家代码.properties(固定的)。以此种命名方式的资源包能被该包及其子包中的动作类访问。
- 优先级:高于全局消息资源包
B 局部消息资源
- 资源包名称命名规范:动作类名称_语言代码_国家代码.properties以此种命名方式的资源包,只为动作类服务。
- 优先级最高(就近原则)。
- 读取资源内容
- jsp读取资源包内容 使用struts的标签s:text获取国际化内容
b、Action读取资源包内容
使用ActionSupport的getText方法,可以读取到资源包的内容
也就是说这个Action一定要继承ActionSupport 这种在实际开发中几乎不用
c、自由指定读取资源包
- 在jsp页面可以使用s:i18n标签指向读取的国际资源包文件
|
|