标签:
Struts2是一个M(模型—域–范围模型)V(View视图)C(控制器)框架(模型2)。框架都是一个半成品。提高开发效率。
Struts1是一个MVC框架,非常流行。有很大的缺点。此时一个webwork的框架设计超前,名气不是很大。Struts1+webworkd=struts2。用的是struts1的名字,但是与sruts1没啥关系,struts2的核心是webwork框架。
web开发Strust2 核心功能
是表现层的开发技术。(背景色为蓝色区域)
3、Struts2入门简单原理图
Filter VS Servlet
过滤器要比Servlet要强大,开发中经常用Servlet作为控制器,Filter也可以作为控制器来使用。
1、下载地址:http://struts.apache.org
2、解压后的目录结构:
a) apps:框架本身提供一些案例(学习)
b) docs:框架本身提供的文档(指南和API)。不保证100%正确
c) lib:框架需要的jar包及第三方的jar包(不要全拷贝)
d) src:源码
搭建步骤:
a、新建一个JavaWeb工程
b、拷贝struts2运行所需的必要jar包。(方便办法:struts2发行包\apps\struts-blank.war,拷贝其中的lib下的所有jar)
if(str!=null&&!str.equals("")){
}
//增强的
if(StringUtils.isEmpty(str)){
}
3、在web.xml中配置核心过滤器:StrutsPrepareAndExcuteFilter(框架提供)
<filter>
<filter-name>struct01</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struct01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、在WEB-INF\classes目录下建立一个名称为struts.xml的配置文件。内容如下:(可以从struts2发行包\apps\struts-blank.war中拷贝)。抄头超屁股。。。。。。。。。
<?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>
</struts>
5、把应用部署到Tomcat中,启动Tomcat,如果没有报错,说明搭建成功
1、编写2个jsp
hello.jsp
<body>
<a href="${pageContext.request.contextPath}/hello.action">访问第一个Struts2案例</a>
</body>
success.jsp
<body>
Struts2访问成功
</body>
2、编写一个动作类(POJO,之前所谓的按照JavaBean规范编写的一个普通的类)
package xgp.struts.actions;
public class HelloAction {
public String sayHello(){
System.out.println("动作方法sayHello执行了,访问成功!");
return "success";
}
}
3、在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 name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<action name="hello" class="xgp.struts.actions.HelloAction"
method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
4、访问测试:
http://localhost:8080/xgp.struts/hello.jsp
执行过程如下
学习目标:熟知struts2的执行过程(下图记住)。源码可以不看
a、过滤器的初始化
1、StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有初始化方法
关键代码:57:dispatcher = init.initDispatcher(config);//初始化请求分发器。
2、InitOperations:
public Dispatcher initDispatcher( HostConfig filterConfig ) {
Dispatcher dispatcher = createDispatcher(filterConfig);
dispatcher.init();
return dispatcher;
}
Dispatcher:分发器
private void init_TraditionalXmlConfigurations() {
String configPaths = initParams.get("config");
if (configPaths == null) {
configPaths = DEFAULT_CONFIGURATION_PATHS;
}
String[] files = configPaths.split("\\s*[,]\\s*");
for (String file : files) {
if (file.endsWith(".xml")) {
if ("xwork.xml".equals(file)) {
configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
} else {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
}
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}
(重要)结论:
初始化过滤器时,会按顺序加载以下配置文件:
———-struts-default.xml,
———–struts-plugin.xml,
———-struts.xml这几个配置文件
———-struts-default.xml: struts2-core-**.jar包内部(框架内部的配置文件)
其中定义了一些Bean对象;有一个抽象的package,内部有一些结果类型,一些拦截器的定义,还有拦截器小组的定义。默认的拦截器小组名字是defaultStack。
———struts-plugin.xml:struts2提供的插件中(插件内部提供)
———struts-xml:程序员自己定义的(开发中经常搞)
b、过滤器的doFilter方法:用户的每次访问
1、ActionMapping mapping = prepare.findActionMapping(request, response, true);
根据你的动作请求,从已经初始化好的配置文件中找对应的动作名称。
2、Dispatcher:
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);
原因:找不到约束文件
解决:
1、联网
2、手工配
a、eclipse的菜单:window\preferences
1、default.properties:在struts2-core-**.jar的org.apache.struts包中
关于Struts2一些常量配置(框架内部)
2、struts-default.xml:在struts2-core-**.jar中。(框架内部)
定义了一些bean;
定义了一个抽象的包:struts-default
定义了一些结果视图
定义了一些拦截器和拦截器小组
3、struts-plugin.xml :在struts2的第三方插件中(插件内部,给插件用的)Struts2-**-plugin.jar中
4、struts.xml:用户自己编写的(重点)
5、struts.properties :用户自己编写的(类路径中,不需要)key和value的形式
6、web.xml :struts2的一些配置可以写在这(Web应用中,不建议)
结论:1~6:后面的配置文件内容,会覆盖前面的。
比如:在struts.xml中覆盖default.properties中的内容,可以这么办:
<constant name="struts.action.extension" value="do"></constant>
比如:在web.xml中把访问的扩展名改为xgp
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>xgp</param-value>
</init-param>
</filter>
<constant name="struts.devMode" value="true" />
<!-- Struts2中的一个常量,表示开发模式,当其值为true,如果配置文件内容改变,框架会重新加载而不需重新启动服务器!-->
Struts-default.xml—–中有这么个包——<package name="struts-default" abstract="true"></package>
package:方便管理动作,作用:对应用中的动作进行模块化管理,就如同把类放在不同包中管理一样。
属性:
http://域名+动作名称.action
如果配置了namespace那么访问资源时就要加上namespace:http://域名+namespace+动作名称.action
区分:namespace=”/”,实实在在的一个名称空间。绝对不是默认的:namespace=””或者不写,下面是具体的访问流程图
作用:定义动作类
属性:
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
小知识:
可以在自己的package中通过以下标签,指定默认的动作类
<default-class-ref class="com.itheima.action.HelloAction"></default-class-ref>
作用:定义动作类执行完毕后转向的结果视图
属性:
来自:struts-default.xml中的结果视图的定义。
如果你要改变这些常量,则在外面的配置文件struts.xml(或者别的配置文件中)修改,覆盖这些框架的默认值:
比如框架中
struts.action.extension=action
, 框架要处理的后缀名称。如果需要改成以*.do
或者*.doo
结尾,则可以在Struts.xml中配置:
<constant name="struts.action.extension" value="do,doo"></constant>
在struts.properties中配置如下
struts.action.extension=do
在web.xml中配置如下
<filter>
<filter-name>struct01</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do</param-value>
</init-param>
</filter>
这里要注意配置文件的优先级.
常量
struts.i18n.encoding=UTF-8 框架使用的编码
struts.action.extension=action, 动作的访问后缀。多个可以使用逗号分隔
struts.serve.static.browserCache=true 指示浏览器是否缓存资源
(原理:三个响应消息头:response.setHeader():Expires Cache-Control Pragma)
struts.configuration.xml.reload = true 是否在更改了struts.xml后自动重新加载。开发阶段有用。
struts.devMode = false 是否是开发模式。开发阶段建议为true。如果为true,struts.configuration.xml.reload就会为true
struts.ui.theme=xhtml 指定页面用的主题(struts标签时介绍)
struts.objectFactory = spring 默认情况,Action都是struts2框架给我们创建的(ObjectFactory,实例工厂)。与Spring框架整合时用。
struts.enable.DynamicMethodInvocation = false 是否允许DMI(动态方法调用:Dynamic Method Invocation)。
struts.multipart.maxSize=2097152 指定文件上传时的大小限制。2M
在项目开发中,为了更好的进行版本控制,经常引入外部的配置文件(比如在struts.xml同级目录下建立一个user.xml,则只需在
<include file="user.xml"></include>
标签:
原文地址:http://blog.csdn.net/z742182637/article/details/51611039