本节内容:
1JavaEE概述
2.Struts2的引入
3.Struts2的入门案例
4.Struts2的底层执行过程
5.Struts2的相关配置
6.Struts2的Action的创建
7Strust2的action方法的访问
一、JavaEE概述:
我们学习了Javaweb我们知道我们的Javaweb程序的组成:jsp、servlet、JavaBean,那么我们在学习Javaweb的时候我们程序我们使用了mvc开发模式:
我们来看一张图来说明一下:
我们常说的3层结构是什么:3层结构是:web层、service层、dao层3层,把我们的MVC中的view层以及Controller层归为了web层,将我们的model层拆分为了,service业务层、以及dao数据库持久层。
我们所说的框架是什么呢?,其实我们所说的框架就是针对我们的3层结构不同层的一个替代,我们的框架就是帮我们实现一部分代码,我们只需要很少的代码就可以完成这个功能。
那么我们所要学习的框架有:
web层框架: struts2、以及spring框架中springmvc模块
service层框架:spring框架
dao层框架:hibernate框架、MyBatis框架
我们现在就开始来学习我们的Struts2框架。
二、struts2的引入
Struts2简介:
Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
2006年,WebWork与Struts的Java EEWeb框架的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2。
在2008年12月,Struts1发布了最后一个正式版(1.3.10),而2013年4月5日,Struts开发组宣布终止了Struts 1的软件开发周期。
所以我们现在说的Struts都是Struts2.
Struts就是封装了Servlet中的各种对象以及请求/响应操作,减少了对web容器的依赖,通俗说struts就是一个庞大的servlet。Struts2对struts1做出了很多的改进,struts2对ServletApi不再依赖。
Struts1的Action是单实例的,一个Action的实例处理所有的请求。Struts 2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题
Struts1要求必须统一扩展自Action类,而Struts2中可以是一个POJO
Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
Struts2中使用了拦截器。
总结:
Struts2使用拦截器概念,结合各种过滤器来获取url,与struts1的最大区别是Struts1(所有请求共享一个实例)单实例,Struts2使用的是多实例(一个请求一个实例)Struts2有一个值栈的概念。Struts2与ServletAPi完全解耦。Struts2可以使用一个POJO类来封装请求。
三、Struts2的入门案例:
需求:我们访问一个url后跳转到一个指定的页面。
Struts2开发准备工作:
struts2开发环境的搭建: jdk、idea、tomcat
1. 我们还需要准备struts2的jar包:
打开:http://struts.apache.org/download.cgi
下载struts2的jar包。 进行解压。
lib下就是struts2的jar包。
2.创建一个web项目
再项目中添加struts2的jar包
3.创建Action:
在struts2中我们可以创建一个普通的POJO来做我们的action。
package com.struts.action; /** * Action类 */ public class HelloWordAction { /** * action的默认执行方法:action会返回一个字符串 * @return * @throws Exception */ public String execute() throws Exception{ return "success"; } }
4.创建视图:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>欢迎页</title> </head> <body> Hello,World!Struts2!!!!! </body> </html>
5.需要在web.xml中配置一个过滤器:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--配置struts2的过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
6.需要在struts.xml中配置action
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--配置action--> <!--package:作用就是分包管理,易于管理我们的action,便于模块开发 name:包的名称。必须写。且必须唯一 namespace:名称空间 extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。 struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。 --> <package name="hello" namespace="/" extends="struts-default"> <!--配置动作:配置我们的action name:动作名称 class:动作全类名 method:动作类中的方法名称。默认是public String execute(){} 要求: 1.public的 2.返回值必须是String 3.没有参数 --> <action name="helloworld" class="com.struts.action.HelloWordAction"> <!--最后的输出:响应 name:逻辑名 --> <result name="success">/index.jsp</result> </action> </package> </struts>
最后运行测试:访问action
这就是一个基本的struts2的入门程序。
四、struts2的底层执行过程
这是一张Struts2的体系架构图:
Struts2框架的处理步骤:
1.用户发送请求:
2.这个请求经过一系列的过滤器(Filter)
3.调用过滤器:FilterDispatcher,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action
4. ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。
5.ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action类 。(在服务器启动的时候,ConfigurationManager就会把struts.xml中的所有信息读到内存里,并缓存,当ActionProxy带着URL向他询问要运行哪个Action的时候,就可以直接匹配、查找并回答了)
6.ActionProxy创建一个ActionInvocation的实例。
7.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到一系列相关拦截器(Intercepter)的调用。
8. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。
9.最后,ActionInvocation对象倒序执行拦截器。
10..ActionInvocation对象执行完毕后,响应用户。
注意:2.1.3之后的核心过滤器由FilterDispatcher换成StrutsPrepareAndExecuteFilter。
五、Struts2的相关配置
struts2有6大配置文件:
1. struts-default.xml 在struts2-core-2.5.17.jar中
2. default.properties 默认常量配置 在org.apache.struts2包下
3.web.xml 项目的配置文件
4.struts.xml 核心配置文件
5.struts.properties 自定义常量配置文件
6. struts-plugin.xml 插件配置文件
优先级:web.xml>struts.properties>struts.xml>default.properties
加载顺序:
1.default.properties
2.struts-defualt.xml
3.struts-plugin.xml
4.struts.xml //配置Action以及常量
5.struts.properties //配置常量
6.web.xml //配置核心过滤器以及常量
这个在启动服务时查看日志信息就可以看到这个顺序
struts2的核心配置文件struts.xml的详解
1.首先我们需要在src目录下创建一个struts.xml文件,并且引入约束:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
2.struts.xml中有一个根标签<struts></struts>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--配置常量--> <constant name="struts.custom.i18n.resources" value="UTF-8"></constant> <!--配置action--> <!--package:作用就是分包管理,易于管理我们的action,便于模块开发 name:包的名称。必须写。且必须唯一 namespace:名称空间 extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。 struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。 --> <package name="hello" namespace="/" extends="struts-default"> <!--配置动作:配置我们的action name:动作名称 class:动作全类名 method:动作类中的方法名称。默认是public String execute(){} 要求: 1.public的 2.返回值必须是String 3.没有参数 --> <action name="helloworld" class="com.struts.action.HelloWordAction"> <!--最后的输出:响应 name:逻辑名 --> <result name="success">/index.jsp</result> </action> </package> </struts>
六、Struts2的Action的创建:
1.使用普通的java类创建
2.使用一个普通的java类继承Action类
3.使用一个普通的java类继承ActionSupport类
package com.struts.action; /** * Action类 */ public class HelloWordAction { /** * action的默认执行方法:action会返回一个字符串 * Action的默认执行方法:execute * 返回值必须是一个String * @return * @throws Exception */ public String execute() throws Exception{ return "success"; } }
七、struts2Action方法的访问
1.传统的访问方式:
<!--struts2的传统访问方式--> <action name="helloworld" class="com.struts.action.HelloWordAction" method="hello"> <result name="success">/index.jsp</result> </action>
2.使用通配符的方式访问
访问的路径和方法的名称必须要又某种联系)通配符就是 * 代表任意的字符
<!--使用通配符方式--> <action name="hello_*" class="com.struts.action.HelloWordAction" method="{1}"> <result name="success">/index.jsp</result> </action>
配置文件中的
hello_*可以匹配请求method属性的值使用{1}来代替,{1}就表示的是第一个*号的位置的值。
3.动态方法访问:
如果使用动态方法访问的方式我们需要配置一个常量:开启动态方法访问。
<!--开启动态方法访问--> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!--配置动态访问--> <action name="hello" class="com.struts.action.HelloWordAction"> <result name="success">/index.jsp</result> </action>