A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丶笑笑 初级黑马   /  2018-6-27 16:19  /  660 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2018-6-29 10:50 编辑


【石家庄校区】Struts2总结

配置过滤器:非常重要,配置完就相当于已经生效,是运行的核心
struts2引入步骤
1.导入jar包
2.需要在web.xml文件中配置一个Filter(只有配置了它才可以使用struts2框架)
3.struts.xml配置(核心配置文件)
4.创建Action来完成逻辑操作
    1.导入13个jar包
    2.需要在web.xml文件中配置StrutsPrepareAndExecuteFilter
    3.创建一个struts.xml文件,它的位置是可以放置在src下。
1.框架
1.半成品,在框架基础上开发
    速度快
    代码比较规范
2.方便协同开发,易于调bug
2.常用框架(1.使用xml方式开发 2.使用注解进行开发(最常用))
ssh
    struts2
    spring(一栈式)
    hibernate
ssm(开发中最常用)
    springmvc
    spring
    mybaites

3.action(重要)
1.action是如何代替servlet
    A)action可以是任意一个类(POJO)
    B)创建一个类实现一个接口Action
       input
       success
       error
      
       execute()
    C)创建一个类继承自ActionSupport类
       错误信息更详细,添加和显示错误信息方便
2.action中如何接收前台页面传递过来的数据
    A)属性驱动(不用)
       在action中定义属性,和前台页面中input标签中name的属性值一一对应,同时需要对这些属性提供get/set方法
    B)对象驱动(不用)
    C)模型驱动(modeldriven)(常用)
3.action如何对结果页面进行跳转(重定向/转发(默认))
    修改方法的返回值为String,然后在struts.xml中的对应action标签配置result标签 result表前中的name值对应的是方法的返回值
4.struts2引入步骤
a)导入jar
b)在web.xml配置过滤器(非常重要/复制粘贴)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
c)配置struts.xml(struts2核心配置文件)
d)在action中写逻辑
jsp StrutsAction的关系
jsp:一个连接  url

StrutsAction:定义一个方法

访问url最后执行StrutsAction中的方法
文件:
struts.xml
标签:
    struts
       package
           action(name[具体的访问路径]/class[类和url进行绑定]/method[url和类中的具体方法进行绑定])
   
class="com.itnannan.xxx"
约束:
eclipse导入本地的dtd文件
    window-->XML
eclipse导入本地的xsd文件

xml(可扩展标记语言)

    1.数据的存储(不用 数据库)

    2.作为数据协议进行传输(xml/json)

    3.作为框架的配置文件
   
dtd约束
schema约束
区别
    1. .dtd /.xsd
    2. schema约束支持命名空间(名称空间)
5.流程:(面试)
1.前端页面发起请求
2.struts2的过滤器
    一堆拦截器
3.struts.xml---->找到package和action-->找到类的具体方法
4.获取方法的返回值--->struts.xml中的具体action--->result(决定页面的跳转)

6.struts2配置文件加载顺序(面试)
1.default.properties(常量)

2.struts-default.xml(默认配置)

3.struts-plugin(struts插件的配置)

4.struts.xml(自定义配置)****
7.struts.xml标签详解!!!!!!!!!!!!!!!!!!!!!!!(超重要)
package
    name
    namespace  配合action中的name组合成为一个具体的uri
    extends       继承配置   struts-default

action
    name   配合package中的namespace组合成为一个具体的uri
    class  该路径所匹配的具体的类(全类名)
    method 访问路径的所执行具体的类的具体方法

result
    name   和方法中的返回值做匹配,如果匹配,进行对应跳转
    type   跳转页面的方式(redirect(重定向)/dispatcher(转发[默认值])  )

constant(和package标签同级) 常量
    name(参照default.properties[修改对应常量])
    value
8.默认值(了解)
访问action
    如果找不到类,默认找ActionSupport类
    如果找不到方法,默认找该类的execute()方法
    如果没有指定跳转页面的跳转方式,默认是dispatcher
9.创建action方式(重要)
1.直接创建一个类
2.创建一个类实现一个接口Action
    input
    success
    error

    execute()
3.创建一个类继承自ActionSupport类
10.访问action路径问题(了解)
1.全路径 2.使用通配符(了解) <action name="xxxx*" class="全类名" method="{1}" /> xxxxaddadd() 动态方法调用(不用) 开启动态方法调用(配置常量) action!方法
11.action接收前台页面传递参数(重要)
A)属性驱动(不用)
    在action中定义属性,和前台页面中input标签中name的属性值一一对应,同时需要对这些属性提供get/set方法
B)对象驱动(不用)
    在action中常见一个对象,对象中的属性和前台页面的提交的name的值一一对应
***C)ModelDriven(最常用)
    1.实现ModelDriven接口,同时需要指定泛型,实现getModel方法
        UserAction implements ModelDriven<User>{}
    2.在类中创建实例对象
       private User user = new User();
    3.getModel方法的返回值返回该对象
       getModel(){return user;}
    4.使用servlet相关api进行获取
Struts2中获取ServletAPI
简单说,可以在action类中获取request  response session...对象
有两种方案:
1. ServletActionContext.getRequest()   ...以此类推
2. 采用注入方式
        truts2框架在运行时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去 strtus.xml文件中查找到匹配的action,在action执行前,会走一些interceptor

        默认执行的拦截器是struts-default.xml文件中定义的。
        在默认执行的拦截器中有一个
       <interceptor-refname="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>


        查看一下ServletConfigInterceptor源代码

       ServletRequestAware, 实现这个接口可以获取HttpServletRequest
       ServletResponseAware ,实现这个接口可以获取HttpServletResponse
       ServletContextAware 实现这个接口可以获取ServletContext
   
12.valueStack 值栈(重要)介绍
我们使用valueStack的主要目的是为我将我们action中产生的数据携带到页面上,也就是说valueStack它就是一个容器。
在Struts2框架中将valueStack设计成一个接口。
    com.opensymphony.xwork2.util.ValueStack
我们主要使用的是它的实现类
    com.opensymphony.xwork2.ognl.OgnlValueStack。

访问一次action意味着发起了一个请求,创建了一个request对象和action对象,执行action的具体逻辑之前,struts框架会帮咱们创建一个ActionContext和VauleStack对象,VauleStack对象会帮咱们保存一些数据,再把该VauleStack对象保存到request域中
    SERVELT    单实例多线程  (存在线程安全问题)
    Action     多实例       (不会存在线程安全问题)
valueStack根据get方法将值自动压入栈,手动用set()

CompoundRoot:它就是一个ArrayList
它主要存储的是action的相关数据

Map<String,Object> context:就是一个Map
Context中主要存储了一些引用,这个引用主要是关于web开发中相关信息
parameters :请求参数
request:请求对象中所有属性
session:会话对象中所有属性
application:application对象中的所有发展
以上都是Map

在struts2框架中我们通过ognl表达式来获取valueStack中数据,没有使用#就会从CompoundRoot中获取数据,
如果使用#来获取,这时就会从context中来获取.
   
获得值栈
1.
ValueStack valueStack = (ValueStack)                                  ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
2.
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
使用
配合ognl使用
ognl主要是配合jsp来使用
    ValueStack包括什么东西
       list----->ognl的根(获取这里面的值不需要加#)   注意:在根中保存了我们当前的action对象
       map------>普通的数据(获取这里面的值需要加#)
   
    ValueStack是如何进行保存数据的(栈结构)(均保存在根中)
       手动存储
           vs.push(Obejct)不用
           ****vs.set(key,value)用
       自动保存
           action对象
           自动保存model(接收前台传过来的数据对象模型)   前提  ****实现modeldriven接口
           
    ValueStack是如何取值
       在jsp页面使用struts标签进行取值
       <s:propertyvalue="username"/>
       <s:propertyvalue="model.username"/>
           //没有new则<s:propertyvalue="username"/>也会改变
           //user =new User();
           user.setUsername("fox");
           user.setPassword("123");
       //如何遍历
           <s:iteratorvalue="ps">
           <tr>
              <td><s:propertyvalue="name" /></td>
              <td><s:propertyvalue="price" /></td>
              <td><s:propertyvalue="count" /></td>
           </tr>
       </s:iterator>
13.拦截器(重点)
Interceptor(今天最重点) 1.struts2业务流程(必须掌握 独立描述出来) 2.自定义的Interceptor 1.创建一个类继承或者实现Interceptor接口(匹配访问当前action的所有方法) MethodFilterInterceptor(匹配指定方法) 2.实现doIntercept()方法 in....invoke();代表放行当前action进入下个Interceptor 不执行invoke()代表拦截该action,就会通过该方法的返回值跳转指定页面 3.struts.xml中配置拦截器 ***action配置具体拦截器/引入自定义的拦截器还需要导入默认的拦截器!!!
流程:
1.浏览器向服务器发送一个请求,StrutsPrepareAndExecuteFilter截取请求,并调用
doFilter(ServletRequestreq, ServletResponse res, FilterChain chain) --简写doFilter方法
doFilter中调用 executeAction(request, response, mapping); --executeAction方法
2.executeAction实现方法中
//生成了当前action的代理
ActionProxy proxy =             getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace,name, method, extraContext, true, false);
通过proxy去执行了proxy.execute();
3.execute()中:retCode = invocation.invoke();invocation它是ActionInvocation一个对象
invoke()方法中:
//执行interceptor,intercept方法又执行了invocation.invoke(),形成了递归调用,因此执行完action后会反顺序将拦截器后续代码执行完
resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
会去加载我们的配置文件,将配置文件中所有的interceptor得到进行遍历。
在struts-default.xml文件中定义了默认加载的拦截器栈defaultStack
1.struts文件上传(怎么要求怎么写)多文件上传 (默认文件大小的限制) 2.json jsonXML的区别 转换json所涉及的三方库(jsonlib/gson/fastjson/jackson 3.struts注解 @package @namespace ... 区别和使用

1.文件上传注意事项:
浏览器端注意事项:
    表单提交方式method=post
    表单中必须有一个<inputtype=”file”>组件
    表单中必须设置enctype=”multipart/form-data”
服务器端
     Commons-fileupoad.jar包完成。
Struts2框架本身支持文件上传:
问题:struts2框架如何完成文件上传?
Struts2框架使用一个fileupload的interceptor来完成文件上传,而我们要使用它
<interceptor name="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
在action中我们可以提供类似以下的操作就能完成文件上传操作
     private File file;//名字和jsp中name属性相同
     private String contentType;//文件类型
     private String filename;//文件名称
     
     eg:
     private File upload;
     private String uploadFileName;
     private String uploadContentType;
在execute方法(不指定方法时的默认方法)中将文件copy就可以完成文件上传。(也可以自己定义方法)
    FileUtils.copyFile(upload,dest);
上传错误信息显示:
<resultname="input">/error.jsp</result>
页面:
<s:actionerror/>
<s:fielderor/>
多个文件同时上传:
private File[]upload;
private String[] uploadFileName;
private String[] uploadContentType;

<input type="file"name="upload">
<input type="file"name="upload">
<input type="file"name="upload">
<input type="submit" value="提交">
2.json(重要)Fastjson:

    两个API:
    //集合和数组
    JSONArray.toJSONString()
    //对象
    JSONObject.toJSONString()
       //格式化日期注解
       @JSONField(format="yyyy-MM-dd")
      
    指定属性不在json串中生成

    让json串不包含age属性

    PropertyFilterfilter = new PropertyFilter(){  
       @Override  
       public boolean apply(Object object, String name, Object value) {  
           if(name.equals("age")){  
              return false;  
           }  
           return true;  
       }  
    };
    String json = JSONObject.toJSONString(user, filter);
Jackson:
转换成json对象
    ObjectMappermapper = new ObjectMapper();
    String json = mapper.writeValueAsString(user);

转换成json数组
    ObjectMappermapper = new ObjectMapper();
    String json = mapper.writeValueAsString(list);

json转换过程中自动将date转成目标日期格式
    ObjectMappermapper = new ObjectMapper();
    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); // 设置日期格式化器
    String json = mapper.writeValueAsString(p);

指定属性不在json串中生成

让json串不包含age属性
方式一:
    public class User {  
       private int id;
       private String name;  

       //不JSON序列化年龄属性  
       @JsonIgnore   
       private int age;  
         
       private Date birthday;  
      
       //省略get/set
    }
    String json = mapper.writeValueAsString(user);
   
方式二:

    @JsonFilter("userFilter")
    public class User {  
       private int id;
       private String name;  
       private int age;  
         
       private Date birthday;  
      
       //省略get/set
    }

    //     FilterProvider fp= new SimpleFilterProvider().addFilter("userFilter",
    //            SimpleBeanPropertyFilter.filterOutAllExcept("id","name")); //只包含id与name
           
    FilterProviderfp = new SimpleFilterProvider().addFilter("userFilter",
           SimpleBeanPropertyFilter.serializeAllExcept("id", "name")); //不包含id与name
   
    mapper.setFilters(fp);

    String json = mapper.writeValueAsString(list);

了解struts框架的json插件(用的很少)
先导包
1.  将我们自己配置文件中的<packageextends=”json-default”>.
2.  Action的返回视图<result name=””type=”json”>
3.  因为我们配置了上面两步,那么struts2框架就会将valueStack中的栈顶元素转换成json响应到浏览器
Strtus2框架如果处理ajax请求
//异步请求返回数据
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
response.getWriter().println(jsonString);
3.注解开发(重要):
@Namespace来代替<package  namespace="">
@ParentPackage来代替<package extends="">
@Action来描述关于<action>配置

    value属性<action name="">
    使用@Action的results来描述关于结果类型的配置<result>
    <result name="" type="">

    @Action(results={@Result(name="",type="",location="")})
    @Actions
    作用:可以通过多个映射来访问同一个action
@Action(value="login",results={@Result(name="success",location="/success.jsp"),@Result(name="fail",location="/login.jsp")

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马