java开发中常用框架介绍:
ssh:struts2 spring hibernate
ssm(ssi):springmvc spring mybatis(ibatis)
struts2.0框架概述:
strus2.0是一个基于mvc设计模式的web应用框架,它本质上相当于一个servlet,在mvc设计模式中,struts2.0作为控制器来建立模型与视图的数据交互,struts2.0采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与servlet api完全脱离。
struts2.0核心:
1.interceptor 拦截器
2.Action
3.ognl && valueStack
struts2.0框架的使用步骤:
1.导入相关jar包(官网:struts.apache.org)
jar包内文件夹分析:
apps 示例代码
docs 文档
lib 相关jar包
src 源代码
我们使用struts框架不是直接将它的lib包下的所有jar文件copy到项目中,而是使用其中的一部分。我们可以参考它的是代码。(改示例代码项目struts2-blank后缀为zip,解压后找到lib中的jar包)
2.需要在web.xml文件中配置一个Filter(只有配置了它才可以使用strtus2框架)
1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>struts2</filter-name> 7 <url-pattern>/*</url-pattern> 8 </filter-mapping>
3.struts.xml配置文件,它的位置放在src下。(apps示例代码classes文件夹中可以找到)
4.创建Action来完成逻辑操作
struts2.0执行流程:
1.当通过浏览器发送一个请求;
2.会被StrutsPrepareAndExecuteFilter过滤器拦截;
3.StrutsPrepareAndExecuteFilter会调用struts2框架默认的拦截器(interceptor)完成部分功能;
4.根据struts.xml文件调用指定的action;
5.执行Action中的操作,根据Action中方法的执行结构来选择来跳转页面Result视图;
???6.会调用struts2框架默认的拦截器(interceptor)完成部分功能;
注意:一般管StrutsPrepareAndExecuteFilter叫做前端控制器(核心控制器),只有配置了这个filter我们struts2框架才能使用。
struts2的默认拦截器(interceptor)他们是在struts-default.xml文件中配置的。
struts-default.xml文件是在struts-core.jar包中,默认的拦截器是在名为defaultStack的拦截器栈(<interceptor-stack>)中定义的。
当我们在浏览器中访问一个jsp页面,StrutsPrepareAndExecuteFilter过滤其就会拦截到这个请求,就会根据请求路径在struts2.xml文件中进行判断,调用指定的一个Action的方法。
eg:
<struts> <!-- package标签中namespace的属性值 + action标签中name的属性值就是访问的对应的url地址 --> <package name="default" namespace="/" extends="struts-default"> <action name="struts2" class="" method="show"></action> </package> </struts>
struts2.0源码导入:
src下文件夹分析:
apps
assembly
core
plugins
src
xwork-core
pom.xml
对于struts2框架它的源代码我们主要使用三部分:
1.struts2核心部分源代码
org.apache.struts2开头的类全名要查找的是core目录下的源代码(core\src\main\java)
2.struts2的xwork核心部分源代码
com.opensymphony.xwrok2开头的类全名要查找的是xwork-core目录下的源代码(xwork-core\src\main\java\com\opensymphony\xwork2)
3.struts2的插件的源代码
src\plugins
在没有网络情况下,解决struts.xml编辑时只能提示问题:
1.windows-preferences-xml-xml catalog
2.点击add配置
location:查找的是dtd文件本地的位置(源代码中[src\core\src\main\resources\struts-2.3.dtd])
key type:URI
key:strtus.xml文件中<!DOCYTPE>标签中的路径
struts2配置文件的加载顺序:
StrutsPrepareAndExecuteFilter过滤器中init()方法中加载了:
dispatcher = init.initDispatcher(config);//init()方法中该段代码中执行了如下方法;
init_DefaultProperties();//1 init_TraditionalXmlConfigurations();//2 init_LegacyStrutsProperties();//3 init_CustomConfigurationProviders();//4 nit_FilterInitParameters();//5 init_AliasStandardObjects();//6
第一个加载的是default.properties文件
位置:struts2-core.jar包,org.apache.struts2包下
作用:主要是声明了struts框架的常量,如struts2框架默认使用utf-8编码;
第二个加载的是一批配置文件
struts-default.xml
位置:struts2-core.jar
作用:声明了interceptor result bean
struts-plugin.xml
位置:在struts2的插件包中
作用:主要用于插件的配置声明
struts.xml
位置:在我们自己的工程中
作用:用于我们自己工程使用struts2框架的配置
第三个加载的是我们自定义的struts.properties文件
位置:都是在自己工程的src下。
作用:定制常量
第四个自定义配置提供
第五个加载的是web.xml文件
主要是加载struts2框架在web.xml文件中的相关配置。
第六个bean相关配置
Struts.xml文件配置介绍:
<struts> 根标签
<package>配置
name属性 作用:定义一个包的名称,它必须唯一;
namespace属性 作用:主要是与action标签的name属性联合使用,来确定一个action的访问路径
extends属性 作用:指定我们继承自哪个包。一般值是struts-default
struts-default包是在struts-default.xml文件中声明的。
abstruct属性 作用:它代表当前包是一个抽象的,主要是用于被继承。
<action>
name属性 作用:主要是与package标签的namespace属性联合使用,来确定一个action的访问路径
class属性 作用:用于指示当前的action类
method属性 作用:用于指示当前action类中的哪个方法执行
<result>它主要是用来指示结果视图;
name属性:作用:是与action类的method方法的返回值进行匹配,来确定跳转路径。
type属性:作用:用于指定跳转方式;不指定的话默认是转发;
type属性取值范围:
chain:它类似于请求转发,只不过它针对于action跳转。
dispatcher:转发(默认值),针对于jsp页面
freemarker
httpheader
redirect:重定向,针对于jsp页面
redirectAction:类似于重定向,针对于action
stream
velocity
xslt
plainText
postback
当多个action有相同的result,可以向上抽取,在<package>下定义全局result:<global-result><result name = "" type = ""></result></global-result>
关于action配置中class&method默认值以及result中name&type默认值的问题:
struts-default.xml文件中配置了如下代码:
<default-class-ref class="com.opensymphony.xwrok2.ActionSupport"/>
它的作用就是当一个请求来时,如果找不到指定的class以及对应的mehtod就会执行ActionSupport类中的execute方法,在这个方法中默认返回的是"success",也是说,result的name默认属性值是success,默认的跳转方式是请求转发dispatcher。
即:
action标签中:
class 默认值:com.opensymphony.xwrok2.ActionSupport
method默认值:execute
result标签中:
name默认值:success
type默认值:dispatcher
struts2常量配置:
default.properties文件中定义了struts2框架常用常量。
定义常量的三种方法:
1.在src下创建一个struts.properties配置文件
2.可以在web.xml文件中配置的(不推荐使用)
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <ini-param> <param-name>struts.i18n.encoding</param-name> <param-value>GBK</param-value> </ini-param> </filter>
3.可以直接在struts.xml文件中定义常量(推荐使用)
<constant name = "struts.i18n.encoding" value = "utf-8"></constant> <!-- 可以帮助我们解决post请求乱码问题,等效于request.setCharEncoding("UTF-8") -->
<constant name = "struts.action.extension" value = "action"></constant> <!-- 指定struts2框架路径的扩展名,即访问路径中后缀为.action才可以拦截执行struts2框架,该常量原默认值为"action,,"表示有后缀action和没有后缀都可以被过滤器拦截执行 -->
<constant name = "struts.devMode" value = "true"></constant> <!-- 配置为true,他会提供更加详细的报错信息,以及在struts.xml修改后不再需要重启服务器 -->
<constant name = "struts.enable.DynamicMethodInvocation" value = "true"></constant> <!-- 开启动态方法调用 -->
注意:后加载的配置文件中的常量会将先加载的常量覆盖掉。
Struts2的Action详解
struts2中的action,主要是完成业务逻辑操作,action替代在servlet中完成的作用。
如何创建一个action
action类的三种创建方式
1.创建一个pojo类(plani ordinary java objec 简单的java对象)
pojo类就是没有implements任何接口没有extends任何类
优点:无耦合
缺点:所有功能都需要自行完成
2.创建一个类实现Action接口
com.opensymphony.xwork2.Action
在Action接口中定义了五个常量(ERROR,INPUT,LOGIN,NONE,SUCCESS),一个execute方法。
五个常量:他们是默认的五个结果视图。
ERROR:错误视图
INPUT:它是struts2框架中interceptor中发现问题会访问的一个视图
LOGIN:登陆视图,可以在权限操作中使用
NONE:它代表null,什么都不做,也不会做跳转。
SUCCESS:成功视图。
优点:耦合度低
缺点:还是需要自行来完成功能。
3.创建一个类继承ActionSupport类
com.opensymphony.xwork2.ActionSupport
ActionSupport也实现了Action接口
我们在开发中一般会使用这种方案:
优点:具有丰富的功能,例如,表单校验,错误信息设置,国际化
缺点:耦合度高
如何访问一个action
1.直接通过<action>标签来配置,通过method来指定访问的方法,如果没有method方法,默认访问execute方法。
2.简化的action访问方式,可以使用*通配符。
<action name = "*_*" class = "cn.com.{1}Action" method = "{2}"></action>
3.扩展-动态方法调用:(不建议使用)
访问路径 感叹号 执行方法
eg:localhost:8080/struts2/User!login
这是struts2中提供的动态方法调用。
注意:对于struts的动态方法调用,要想使用我们必须配置一个常量来开启动态方法调用:[struts.enable.DynamicMethodInvocation = true]