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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【石家庄校区】Struts2框架知识详解
框架介绍
框架(framework)是一个基本概念上的结构,用于去解决或者处理特定领域的复杂问题
特点
  半成品,在框架基础上开发。速度快,代码比较规范
  方便协同开发,易于调试bug
  重用代码大大增加,软件生产效率和质量也得到了提高
  使用框架开发,它提供统一的标准,大大降低了我们的后期维护
常用框架
  SSH:struts2 spring hibernate
  SSM(SSI):springmvc spring mybatis(ibatis)
Javaweb中MVC
  Model -- javabean
  View -- jsp
  Controller -- servlet
Struts2:基于MVC设计模式的web应用框架,本质同一个Servlet,在MVC中Structs2所谓控制器Controller来建立模型与视图数据交互
基本使用步骤
  1.导入jar:apps中blank项目拷即可
  2.web.xml配置过滤器拦截所有页面
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  3.struts.xml(放在工程src目录下)配置<package><action><result>
  4.Action中写逻辑
Struts2框架执行流程(重点)
源码文件
  核心源码 org.apache.struts2xx,src\core\src\main\java
  xwork核心源码 src\xwork-core\src\main\java\com\opensymphony\xwork2
  插件源码 src\plugins
执行流程
  1.浏览器请求action
  2.StrutsPrepareAndExecuteFilter过滤器拦截请求(称为前端控制器,核心控制器)
    通过struts-default.xml/struts.xml 加载拦截器
  3.按顺序执行拦截器,放行后执行下一个拦截器,
    通过struts.xml - 找到具体action具体方法
    返回值找到指定模板(如jsp)
    再依次调用拦截器回调函数执行方法
  4.通过HttpServletResponse将模板响应到页面
Struts2配置文件加载顺序(重点)
  1.default.properties 声明常量 位置:strtus2-core.jar包 - org.apache.struts2包下
  2.struts-default.xml 默认初始化配置 位置:struts2-corl.jar
  3.struts-plugin.xml Struts插件配置 位置:strtus2的插件包
  4.struts.xml 自定义配置文件 位置:创建在自己的工程中
  5.web.xml 第二次加载,相关struts2配置加载
错误信息展示设置
  1.设置常量 struts.devMode=true //页面显示详细信息
  2.设置input视图:拦截器中出现错误会跳转到input
    <action>中配置<result name="input">/error.jsp</result>
    error.jsp中输出错误:<s:actionerror/><s:fiel


action使用操作
创建Action
1.创建一个pojo类(plani ordinary object,简单java对象)
  优点:无耦合 缺点:所有功能需自己完成
2.创建一个类实现com.opensymphony.xwork2.Action接口
  默认视图:
    ERROR : 错误视图
    INPUT: 它是struts2框架中interceptor中发现问题后会访问的一个视图
    LOGIN:它是一个登录视图,可以在权限操作中使用
    NONE:它代表的是null,什么都不做(也不会做跳转操作)
    SUCCESS:这是一个成功视图
  优点:耦合度低 缺点:有的功能需自己完成
3.创建一个类继承com.opensymphony.xwork2.ActionSupport类
  优点:具有丰富的功能,例如  表单校验 错误信息设置  国际化
  缺点:耦合度高
action访问方式
1.将action中对应方法返回值改成String,通过配置<action>的name属性标签匹配
2.简化<action>配置,使用*通配符
  如:<action name="xxx*" class="全类名" method="{1}" />
  不建议多使用,最多一个通配符
3.动态方法调用(不使用,漏洞)
  访问格式:action!方法
  须配置常量开启动态方法调用:struts.enable.DynamicMethodInvocation=true
封装数据
1.属性驱动(少用)
  a.在action类中提供与请求参数匹配属性,提供get/set方法
  b.在action类中创建一个javaBean,对其提供get/set ,在请求时页面上要进行修改,
    例如:前台使用ognl表达式:user.username  user.password
2.模型驱动ModelDriven(常用)
  action实现ModelDriven接口且指定泛型
  类中创建私有对象且实例化
  实现getModel() 中返回该实例对象
  缺点:只能对一个模型数据进行封装
3.使用servlet相关api获取


struts.xml配置
package标签
  name 定义包名称,唯一
  namespace 配合action中name组合成为一个具体uri
  extends 继承配置信息。一般struts-default
  abstract 代表当前包时一个抽象的。true该包用于被继承
action 标签
  name 配合package中name组合成为一个具体uri
  class 该路径所匹配具体的全类名。默认ActionSupport
  method 执行类的具体的方法。默认execute
result 指示结果视图
  name 和类中方法返回值匹配,进行页面跳转。默认success
  type 页面跳转方式。默认dispatch转发,redirect重定向
struts.xml常量配置
  (可以在src下创建一个strtus.properties配置文件,可以在web.xml文件中配置)
  注意:后加载的配置文件中的常量会覆盖先加载的
  <constant name="" value=""></constant>
  struts.i18n.encoding=UTF-8 //解决post请求乱码问题
  struts.action.extension=action //指定访问strtsu2框架路径的扩展名
  struts.devMode=true //提供更加详细报错信息,以及在struts.xml文件修改后不在需要重启服务器,工程上线需关闭
  
ValueStack/ognl
OGNL(Object-Graph Navigation Language)对象图导航语言,功能强大的表达式语言。OGNL本身也是一个项目,可以单独使用
OGNL作用:
  支持对象的操作,调用对象的方法
  支持静态成员访问
  支持赋值操作与表达串联
  访问OGNL上下文,访问ActionContext
  操作集合对象
ognl主要配合jsp使用
<s:debug/> //页面上显示调试信息按钮
<s:iterator value="集合对象" [var="取出值"]> //遍历集合,如果写了var则取出值会存储到context中,需 #取出值.属性 获取值
ValueStack
  作用:将我们action中产生的数据携带到页面上
  接口com.opensymphony.xwork2.util.ValueStack
  实现类com.opensymphony.xwork2.ognl.OgnlValueStack
  包括:
  root 本质ArrayList,在根中保存了当前的action对象
  context 本质Map(ognl获取数据需要加#),存储一些引用,关于web开发相关信息request、session等
获取ValueStack
  1.通过request对象获取
  ValueStack valueStack=(ValueStack)ServletActionContext.getRequest()
    .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
  2.使用ActionContext获取
  ActionContext actionContext=ActionContext.getContext();
  ValueStack valueStack=actionContext.getValueStack()
  ActionContext:action上下文,Struts2会根据每一次的http请求来创建对应的ActionContext,它与当前线程绑
存储数据:action中向root中存储数据,ValueStack的存储结构为栈结构
  手动存储:
  action存储 valueStack.push(Object)
  action存储 valueStack.set("key",Object) //将参数封装到HashMap,存储到root
  自动存储:
  会将每次访问的action存储到valueStack中
  将实现了ModelDriven的模型对象存储到valueStack中
获取数据:jsp中
  ognl获取
  <s:property value="key" /> //对于set存储的数据
  <s:property value="[0].top"/> //对于push存储的数据,根据在栈中数据下标获取(栈中下标从上到下0开始)
  <s:property value="属性名" /> //对于对象
  EL表达式获取
  因为struts2增强了getAttribute()方法,如果在request域中查找不到数据,就会在valueStack中获取
ValueStack存储数据流程:
  servlet:单实例,多线程,存在线程安全问题
  action:多实例,不存在线程安全问题
  一次请求 - 一个线程 - action - -ActionContext - valuestack
  流程:浏览器访问一次action意味着发起了一个请求,服务器创建一个request对象
  struts创建一个ActionContext,valuestack对象,
  valuestack对象保存数据,再把该valuestack对象保存到request域中

Interceptor
Interceptor:基于spring aop思想,而aop思想它本质上是通过动态代理来实现
作用:拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作
拦截器链(拦截器栈):就是可以将多个拦截器形成一个链,在访问它们时通过递归调用依次访问
自定义Interceptor
1.创建类
  实现 Interceptor(匹配访问当前action的所有方法)
  或继承 MethodFilterInterceptor(可以匹配指定方法)
  Interceptor接口:
  intercept(ActionInvocation invo) //执行操作的方法
  return invo.invoke() //放行
2.struts2.xml配置文件中
  声明Interceptor
  <interceptors> //<package>中
    <interceptor name="" class="">
      //当实现MethodFilterInterceptor时可配置指定拦截/不拦截的方法
      //<param name="includeMethods">方法名,方法名2</param>
      //<param name="excludeMethods">方法名,方法名2</param>
    </interceptor>
    //将多个interceptor封装成一个stack
    <interceptors-stack name="myStack">
      <interceptors-ref name="" />
      <interceptors-ref name="defaultStack" />
    </interceptors-stack>
  </interceptors>
  在<Action>中引入自定义inerceptor
  <interceptors-ref name="" /> //name也可为<interceptors-stack>name
  注意:当显示引入自定义Interceptor,默认defaultStack需要手动导入
  只拦截当前action匹配上的路径
  
文件上传
浏览器三要素
  <form method="post" enctype="multipart/form-data">
  <input type="file" name="upload">
服务器端:Commons-fileupoad.jar包
  public UploadAction extends ActionSupport{
    //添加属性并提供get/set方法
    private File upload; //上传的文件,“upload”与文件上传框name属性对应
    private String uploadContentType; //上传文件的mime类型
    private String uploadFileName; //上传文件名称
    请求方法中
      //创建服务器端文件:new File(路径,uploadFileName)
      //文件上传:FileUtils.copyFile(upload,上面new的)
修改默认上传文件大小
  方式一:针对特定<action>,重新配置fileUpload拦截器
  <interceptor-ref name="fileUpload">
    //配置参数
    <param name="key">value</param>
    maximumSize 每一个action允许的上传文件大小
    allowedTypes 允许文件的mimeType类型,多个逗号分隔,*/*通配符
    allowedExtensions=bmp,txt... 设置允许的文件后缀名,多个逗号
  </interceptor-ref>
  方式二:针对所有action,配置配置
  <constant name="struts.multipart.maxSize" value="2097152"></constant>
多个文件上传
  只需将三个字段类型改为List或数组
  方法中循环遍历操作即可
  
处理ajax
一种方式:可以获取HttpServletResponse来完成json数据响应。
一种方式:使用struts2框架的json插件完成ajax操作:
  1.导入struts2-json-plugin-2.3.24.jar
  2.将struts2.xml配置文件中
    <package extends="json-default">
    <action>中<result type="json">
  truts2框架就会将valueStack中的栈顶元素转换成json响应到浏览器
  默认响应格式为 ps:json
忽略响应的属性
  方式一:在属性get方法上添加注解:@JSON(serialize=false)
  方式二:在配置文件<result>下添加参数
    //设置不包含的属性
    <param name="excludeProperties">ps\[\d+\]\.属性名,...</param>
    //设置包含的属性
    <param name="includeProperties">ps\[\d+\]\.属性名,...</param>
设置root,设置响应格式为 json
    <param name="root">ps</param> //写在参数设置第一行
    下面的参数设置不包含属性去掉 ps

注解开发
导入 struts2-convention-plugin-2.3.24.jar(2.1版本后)
注解操作
  类上
  @Namespace("/") //代替<package namespace="">
  @ParentPackage("struts-default") //代替<package extends="">
  方法上
  @Action(value="",results={@Result(name="",type=""location="")})
  value属性<Action name="">
  results属性<result name="" type="">location</result>
其他注解
  @Actions(@Action(...),@Action(...)) //通过多个映射访问同一个action
  @Results //全局结果视图。<golbal-results><result name="" type="">
  @InterceptorRef //处理拦截器
    在@Action中添加属性:interceptorRefs={@InterceptorRef("name"),...}
    注意:@ParentPackage("") 对于自定义拦截器此注解需改为拦截器所在的包名
struts2识别注解:
  默认配置<constant name="struts.convention.package.locators" value="action,actions,struts,struts2" />
  只要action类的包名中包含value任一值即可识别,否则报错
  可以手动改变配置

0 个回复

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