struts2学习笔记

Posted clnchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2学习笔记相关的知识,希望对你有一定的参考价值。

struts1的名气+webwork核心=struts2

使用struts2的步骤:

  1.导入jar文件
  2.在web.xml中加入一个配置filter。拦截全部的请求/*,    StrutsPrepareAndExecuteFilter
  3.在src下加入一个struts.xml, package-action-result
  4.假设要实现控制,须要加入action类
     4.1.实现Action接口
     4.2.继承ActionSupport类
     4.3.直接创建类。可是必须有方法String execute()
  5.改动struts.xml中的action标签,加入属性class相应该action类


struts.xml中定义常量

  <constant name="" value=""/>
  开发模式:struts.devMode        =  true/false
  默认编码:struts.i18n.encoding  =  UTF-8(默认)

怎样绑定表单元素的值:

  1.使用属性:在action中加入一个同名属性。并提供get/set方法
  2.使用javabean:在aciton中加入一个对象,并提供get/set方法
    表单元素的名字。应该为对象名.属性名
  3.使用ModelDriven

怎样在一个Action类中处理多个请求

  1.在该Action类中,每一个请求填加一个方法
  2.在struts.xml中,加入对应的配置:
     2.1.第一种:在action标签中加入属性method,指定方法
     2.2.另外一种:每一个模块。单独写一个配置文件,在struts.xml中include进来
     2.3.第三种:动态方法:提交时,url后面加上"!方法名",比如"house!add"
     2.4.第四种:通配符:
     <action name="house_*" class="com.HouseAction" method="{1}">


默认action:

    <default-action-ref name="index"/>   
    <action name="index"><result>/index.jsp</result></action>  
   

<result>的属性:

1.name,默认值是success。

相应方法运行的返回结果
2.type,默认值是dispatcher,指跳转方式
  dispatcher:    转发到jsp
  redirect:       重定向到本地或其它jsp或者action
  redirectAction: 重定向到本地action
  chain:          转发到action


动态结果:

  1.在action中加入一个String属性,记录目标url
  2.在方法中动态给该属性赋值
  3.在struts.xml中,该action标签的result的url使用${属性名}


问题:url反复的问题

<form action="user/login">
public String login(){
    return INPUT;
}
<result name="input">/login.jsp</result>
当提交表单失败的时候,因为result默认type是转发,所以url地址不会变;
下次再提交时。会导致/user反复出现。
解决的方法:
1.提交表单的action使用绝对路径,前面加一个request.getContextPath()
2.result中的type改成重定向


设置全局结果和全局异常:
<package name="base" extends="struts-default" namespace="/">
    <global-results>
        <result name="error">error.jsp</result>
    </global-results>
    <global-exception-mappings>
        <exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>
    </global-exception-mappings>
</package>




怎样获得struts2封装的请求,会话,应用

ActionContext ctx = ActionContext.getContext();
Map<String,Object> request    = (Map<String,Object>)ctx.get("request");
Map<String,Object> session    = ctx.getSession();
Map<String,Object> application= ctx.getApplication();

通过实现RequestAware,SessionAware,ApplicationAware接口,也能够获得


怎样在JSP中获取请求,会话,应用中的值:

1.通过jsp内置对象
2.通过el表达式
3.stuts标签:<s:property value="[#request.key][#attr.key]"/>




获得原生的Servlet API对象的方式一:
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession        session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();

获得原生的Servlet API对象的方式二:
通过实现接口ServletRequestAware,ServletContextAware。也能够获得


JSTL:

   <c:if test=""></c:if>
   <c:forEach items="" var=""></c:forEach>
   <c:out value=""></c:out>
   <c:set var="" value=""></c:set>
   <c:remove var=""></c:remove>

OGNL知识点

OGNL訪问Value Stack(值栈):对象名.属性名
   action中定义的属性

OGNL訪问Stack Context(值栈上下文):#作用域.属性名
   作用域




OGNL訪问List:  list[0], list.get(0)
OGNL訪问Map:  map[‘key‘], map.key,
   取出全部key: map.keys
   取出全部值:  map.values

OGNL訪问Set:  set.toArray()[0]


OGNL调用静态方法和属性:
@类的全然限定名@静态方法名
@类的全然限定名@静态属性名
struts.xml加入常量配置:
struts.ognl.allowStaticMethodAccess  =  true





1.struts自带的jar包:
  antlr-2.7.6.jar和anltr-2.7.2.jar
2.Hibernate的3个lib
   asm.jar
   asm-attrs.jar
   cglib-2.1.3.jar
   commons-collections-2.1.1 和 commons-collections-3.2
   commons-logging-1.0.4     和 commons-logging-api-1.1
找到重名的jar包,删掉低版本号的



Struts2标签:

数据标签:
  1.<s:property value="OGNL表达式" default="" escapehtml="" />
  2.<s:debug/>
  3.<s:date name="OGNL表达式" format="yyyy-MM-dd HH:mm:ss"/>
  4.<s:set var="变量名" value="OGNL表达式" scope="作用域,默认是action"/>--- OGNL路径过长,或反复使用某个方法的运行结果
  5.<s:url value="地址" var="t"/>有var属性当前字符串不显示
  6.<s:a href="字符串"></s:a>,假设href里面想填入OGNL,则须要把字符串转换成OGNL表达式,%{#t}
  7.<s:include value="要包括的jsp"/> 动态的包括

  须要进行转换的:

  1.字符串转换成OGNL:-->%{}
      该属性默认是字符串:s:a-href,s:url-value, s:include-value
  2.OGNL转换成字符串:
      该属性默认是OGNL:--->用引號引起来
         s:property-value,
         s:property-default,
         s:date-name
     s:param-value
  假如不确定该属性是否默觉得OGNL,能够使用%{},来保证作为OGNL表达式处理

控制标签:
  1.<s:if test="OGNL表达式"></s:if>
  2.<s:else><s:elseif>
  3.<s:iterator var="当前元素"  value="集合" status="集合状态">
       取当前元素的属性:<s:property value="#当前元素.属性名"/>
       推断当前索引是否奇数:<s:if test="#集合状态.odd"></s:if>
       推断当前索引是否偶数:<s:if test="#集合状态.even"></s:if>
    </s:iterator>
   使用jQuery实现隔行变色
   $(function(){
       $("table tr:gt(0):even").css("background","yellow");
   });



UI标签:
   <s:form theme="主题" action="" method=""></s:form>
   <s:textfield name="" value=""/>
   <s:textarea name="" value=""/>
   <s:submit/>
   <s:select name="" list="OGNL表达式" listKey="作为value的属性" listValue="作为显示文字的属性"/>
   
   <s:doubleselect
        name="" list="OGNL表达式1" listKey="作为value的属性" listValue="作为显示文字的属性"
        doubleName="" doubleList="OGNL表达式2" doubleListKey="作为value的属性" doubleListValue="作为显示文字的属性"/>

   注:OGNL表达式2应该是依据OGNL表达式1取出的集合。比如map.get(top)

   日历控件:<s:datetimepicker name=""/>
   引入步骤:1.导入struts-dojo-xxx.jar
             2.在jsp上引入该taglib:
        <%@taglib uri="/struts-dojo-tags" prefix="sx"%>
          3.在head中加入标签。标志要引入相关css和js文件
        <sx:head parseContent="true"/>
             4.使用该日历控件

使用拦截器

使用拦截器的步骤1.新增一个拦截器类,继承AbstractInterceptor,在实现intercept()方法,进行拦截前后的操作。


  intercept(ActionInvocation invocation){
    //1.拦截前操作
    //2.运行兴许
    String result = invocation.invoke();
    //3.拦截后操作
    return result;
  }
2.在struts.xml的package中,加入拦截器
<interceptors>
    <interceptor name="拦截器1" class="类的全限定名"/>
    <interceptor name="拦截器2" class="类的全限定名"/>

    <interceptor-stack name="拦截器栈名">
     <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="拦截器1"/>
        <interceptor-ref name="拦截器2"/>
    </interceptor-stack>
</interceptors>

3.在struts.xml的action中,指定拦截器
       <interceptor-ref name="拦截器|拦截器栈"/>
  假设还要使用struts默认的拦截器栈,须要再加入:
       <interceptor-ref name="defaultStack"/>




表单内容:  学号、姓名、照片

Struts实现文件上传:

单个文件:
1.表单中加入文件域。同一时候表单的提交方式应该是post,enctype属性应该是multipart/form-data
2.加入commons-fileupdate**.jar,commons-io**.jar
3.在action中。依据文件域的name,加入三个属性
     File xxx;
     String xxxContentType;
     String xxxFileName;
4.在action方法中,将文件另存
    String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");

    FileOutputStream fos = new FileOutputStream(uploadPath+"/"+xxFileName);
    FileInputStream fis = new FileInputStream(xxx);
    IOUtils.copy(fis, fos);


限制文件上传的大小:
1.设置全局常量
  <constant name="struts.multipart.maxSize" value="5000000"/>

2.加入拦截器:限制单个action的文件上传大小
  <intercepter-ref name="fileUpload">
      <param name="maximumSize">5000000</param>
  </intercepter>
  <intercepter-ref name="defaultStack"/>

   全局常量的默认值是2M。假设要限制文件大小小于2M。两种方式任选其一。
   假设要限制文件大小大于2M,则所有常量必须设置为大于或等于目标大小,拦截器可选。





限制文件上传的类型:
  给fileUpload拦截器加入參数:
  <intercepter-ref name="fileUpload">
      <param name="allowedTypes">image/jpeg,image/pjpeg,image/png,image/gif</param>
  </intercepter>
  <intercepter-ref name="defaultStack"/>


假设出现错误:HTTP Status 404 - No result defined for action com.pb.web.action.UploadAction and result input
则是表示当result是input时,没有在action中定义相应的result。


file文件域,仅仅能取value。不能给value赋值












































































































































































































































































以上是关于struts2学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

[Struts2学习笔记] -- 输入校验

Struts2学习笔记-jsp中引用struts2框架

struts的学习笔记

Struts2学习笔记

Struts2学习笔记

java学习笔记 —— Struts2 国际化 [1]