首页 > 代码库 > struts2学习笔记

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=http://www.mamicode.com/""/>
  开发模式: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=http://www.mamicode.com/"[#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=http://www.mamicode.com/"">
   <c:set var="" value=http://www.mamicode.com/"">
   <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=http://www.mamicode.com/"OGNL表达式" default="" escapeHTML="" />
  2.<s:debug/>
  3.<s:date name="OGNL表达式" format="yyyy-MM-dd HH:mm:ss"/>
  4.<s:set var="变量名" value=http://www.mamicode.com/"OGNL表达式" scope="作用域,默认是action"/>--- OGNL路径过长,或重复使用某个方法的执行结果
  5.<s:url value=http://www.mamicode.com/"地址" var="t"/>有var属性当前字符串不显示
  6.<s:a href=http://www.mamicode.com/"字符串">,如果href里面想填入OGNL,则需要把字符串转换成OGNL表达式,%{#t}
  7.<s:include value=http://www.mamicode.com/"要包含的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=http://www.mamicode.com/"集合" status="集合状态">
       取当前元素的属性:<s:property value=http://www.mamicode.com/"#当前元素.属性名"/>
       判断当前索引是否奇数:<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=http://www.mamicode.com/""/>
   <s:textarea name="" value=http://www.mamicode.com/""/>
   <s:submit/>
   <s:select name="" list="OGNL表达式" listKey="作为value的属性" listValue=http://www.mamicode.com/"作为显示文字的属性"/>
   
   <s:doubleselect
        name="" list="OGNL表达式1" listKey="作为value的属性" listValue=http://www.mamicode.com/"作为显示文字的属性"
        doubleName="" doubleList="OGNL表达式2" doubleListKey="作为value的属性" doubleListValue=http://www.mamicode.com/"作为显示文字的属性"/>>
   注: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=http://www.mamicode.com/"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学习笔记