本帖最后由 小石姐姐 于 2018-6-29 11:14 编辑
Struts2框架总结
框架的概述概念:框架就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。 优点: 重用代码大大增加,软件生产效率和质量也得到了提高 使用框架开发,它提供统一的标准,大大降低了我们的后期维护。 常用框架SSH SSM 环境搭建1.导入jar包; 2.配置web.xml,配置一个叫做StrutsPrepareAndExecuteFilter的filter; 3.配置struts.xml; 4.创建action类,在类中编写业务逻辑,通过struts.xml将action与访问uri进行绑定 struts2执行流程
1.前端页面发起请求会被StrutsPrepareAndExecuteFilter拦截 2.会调用strtus2框架默认的拦截器(interceptor)完成部分功能 3.struts.xml---->找到类的具体方法,执行方法中的操作 4.获取方法的返回值--->struts.xml中的具体action--->result(决定页面的跳转) 5.一般管StrutsPrepareAndExecuteFilter 叫做前端控制器(核心控制器) struts2配置文件加载顺序(面试)l 第一个加载的是default.properties文件 l 位置:strtus2-core.jar包 org.apache.struts2包下 l 作用:主要是声明了struts2框架的常量 l 第二个加载的是一批配置文件 l Struts-default.xml l 位置:struts2-corl.jar l 作用:声明了interceptor result bean l Struts-plugin.xml l 位置:在struts2的插件包中 l 作用:主要用于插件的配置声明 l Struts.xml l 位置:在我们自己的工程中作用:用于我们自己工程使用strtus2框架的配置 l 第三个加载的是自定义的strtus.properties l 位置:都是在自己工程的src下 l 作用:定制常量 l 自定义配置提供 l 第五加载的是web.xml配置文件 l 主要是加载strtus2框架在web.xml文件中的相关配置. l 第六 bean相关配置 struts.xml标签配置package标签 name:定义一个包名称,必须唯一 namespace:与action标签中的name属性联合使用来确定一个action的访问路径 extends:指定继承自哪一个包。一般是"struts-default" abstract:代表当前包是抽象的,主要是用于被继承 action标签 name:与package标签中的namespace属性联合使用来确定一个action的访问路径 class:用于指示当前的action类 method:于指示当前的action类中的哪个方法执行 result标签 name:作用是与action类的method方法的返回值进行匹配,来确定跳转路径 type:用于指定跳转方式 text位置填写跳转的路径 constant常量标签 name value default.properties文件中定义了struts2框架常用常量 . 问题:我们怎样可以定义常量 1.可以在src下创建一个strtus.properties配置文件 2.可以在web.xml文件中配置 3.可以直接在strtus.xml文件中定义常量 (推荐) 扩展:action及result标签的默认值 当一个请求来时,如果查找不到指定的 class 及对应的 method 就会执行ActionSupport 类中的 execute 方法。 在这个类的 execute 方法中默认返回的是”success”。也就是说,result 的 name 属性默认值是 success,默认的跳转方式是请求转发 dispatcher 获取Servlet API 通过ServletActionContext获取 ServletActionContext.getRequest() ServletActionContext.getResponse() ServletActionContext.getServletContext() ServletActionContext.getReqeuset().getSession() 采用注入的方式 Struts2框架在运行时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去 strtus.xml文件中查找到匹配的action,在action执行前,会走一些interceptor",其中有一个叫做servletConfig的拦截器,可以将Serlvet API注入到Action类中 如果要在Action类中使用Servlet API,可以让Action实现相应的Ware接口 //ServletRequestAware
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
//ServletResponsetAware,ServletContextAware类似 在action中获取请求参数 属性驱动 对象驱动 模型驱动,实现ModelDriven接口 Servlet相关api ognl表达式 OGNL 三要素: 表达式;OgnlContext上下文;Root 根 ognl在jsp中的使用: <!--引入标签库-->
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="ongl表达式">
<s:iterator var="遍历出来的每一个对象" value="待遍历对象"></s:iterator> ValueStack值栈· ValueStack是一个容器,目的是将action中产生的数据携带到页面上,ValueStack被存放在request中
接口:com.opensymphony.xwork2.util.ValueStac 实现类:com.opensymphony.xwork2.ognl.OgnlValueStack ValueStack分为两部分 Root根(CompoundRoot):本质是一个ArrayList,主要存储action的相关数据 Context:本质是一个Map<String,Object>,主要存储了一些引用,这个引用主要是关于 web 开发中相关信息 parameters :请求参数 request:请求对象中所有属性 session:会话对象中所有属性 application:application 对象中的所有发展 以上信息都是通过Map存储的 #:获取Root中的内容不需要加#号,context中的内容需要加#号 %:用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。 在国际化资源文件中,引用OGNL表达式 在Struts 2配置文件中,引用OGNL表达式 request,action,actionContext,valueStack的关系 当客户端向我们发送一个请求,服务器就会创始一个 Action 来处理请求,struts2 中的 action是多例的,每一次请求都会有一个新的 action 对应。所以它不存在线程安全问题。 当客户端向我们发送一个请求,服务器会根据struts-default中配置的路径创建一个action实例,同时会创建一个对应的actionContext和valueStack,并将action实例存入valueStack中,如果action实现了ModelDriven接口,那么也会把model对象存入vs中 存值 手动向根中存储 push(Object) set(key,value) 自动存储 当前action对象 如果action实现了modeldriven接口,那么也会存储model对象 其他api 如果action继承了ActionSupport,那么可以使用addActionError(),addActionMessage(),addFieldError()向vs中存储信息,相应的使用<s:actionerror>,<s:actionmessage>标签在jsp中取出 拦截器Interceptor 自定义Interceptor 实现com.opensymphony.xwork2.interceptor.Interceptor接口,或者继承MethodFilterInterceptor类 在struts.xml中配置<interceptors>标签,并用<interceptor-ref>引用 过滤执行方法 创建Interceptor时继承MethodFilterInterceptor 在struts.xml的<interceptors>中配置<param name="includeMethods"或者"excludeMethods">方法名</params> 文件上传 条件:<from enctype="multipart/form-data" method="post"></form> ,<input type="file" name=""> package com.example;
import java.io.File;
import com.opensymphony.xwork2.ActionSupport;
public UploadAction extends ActionSupport {
private File file;
private String contentType;
private String filename;
public void setUpload(File file) {
this.file = file;
}
public void setUploadContentType(String contentType) {
this.contentType = contentType;
}
public void setUploadFileName(String filename) {
this.filename = filename;
}
public String execute() {
String path = "";
File destFile = new File(path,filename);
FileUtils.copyFile(file,destFile);//此处有try catch
return SUCCESS;
}
} 注解开发类上: @NameSpace("/") @ParentPackage("struts-default") 方法上 @action(value="",results={@Result(name="",type="",location=""),@Result(...)})
|