我是靠谱客的博主 还单身八宝粥,最近开发中收集的这篇文章主要介绍struts2知识总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

好吧.总结一下自己的struts2的笔记.

Struts2: struts 和WebWork的技术基础上进行合并产生的

1.      web.xml配置:
基本配置:<filter><filter-mapping><welcome-file-list><listener>
struts2.0和struts2.0的<filter-class>是不同的

2.     struts.xml配置:
   常量配置:

<constant name=”struts.devMode” value=”true”>
<constant name=”struts.i18n.encoding” value=”GBK”/>
<constant name=”struts.ognl.allowStaticMethodAccess” value=”true”/>

<constant name=”struts.ui.theme” value =”simple”/>

可以使用通配符*和{}占位符进行相应的配置
例子:

<action name=”Student*” class=”temp.StudentAction” method=”{1}”>
   <result>/Student{1}_success.jsp</result>
</action>

可以使用<include file=”login.xml”>进行xml文件的包含
定义定义默认action

<default-action-ref name=”index”></default-action-ref>

<action>

  <result>/default.jsp</result>

</action>

 

 

 

 

 

Result类型:

dispatcher:用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。这个是默认的;

redirect:可用于返回一个页面、一个action、链接到一个网址。
缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。
所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。

chain:功能与redirect的action转发类似,不过与redirectaction转发功能不同的是它可以将Action中的数据一直保存在同一个HTTP请求中。

 

 

3.    Struts的源代码: src/core/src/main/java

                        文档: docs/struts2-core/apidocs

  配置xml命名空间: struts-core.jar解压里面有个struts-2.0dtd文件

4.     struts大概执行过程:client->tomcat->web.xml->filter->action->视图

5    .页面显示相关:
使用struts2的标签库: <%@taglib prefix="s" uri="/struts-tags" %>
路径问题:struts2中的路径是根据action路径而不是jsp路径来的.所以解决方法就是统一使用绝对路径
<%basePath=getServletContext.getRealPath()%>
加上<base href=”<%=basePath%>”>
struts标签:
<s:set name=”” value”” scope>在action中传参数,可以用var从先定义参数的name,scope默认是action范围就是actionContext和request两个范围.而且很好用name关键字,一般用直接用var关键字

注意点:
<s:param name=”name” value=”’billy’”></s:param>这样’billy’就是一个字符串
<s:set>还可以设置list map等集合类型
$#%的区别

a)$用于i18n和struts配置文件

b)#去的ActionContext的值

c)%将原本的文本属性解析为ognl,对于本来是ognl的属性不起作用

iterator遍历:

<s:iterator value=”{1,2,3}”>

  <s:property/>

</s:iterator>

iterator遍历+自定义变量

<s:iterator value=”{‘aaaa’,’bbb’,’ccc’}”  var=”x”>

   <s:property value=”#x.toUpperCase()”/>

</s:iterator>

使用status:

<s:iterator value=”{‘aaaa’,’bbb’,’ccc’}”  stats=”x”>

  遍历过的元素总数 <s:property value=”#x.index()”/>|

  遍历过的元素索引<s:property value=”#x.even()”/>|

  当前是偶数?<s:property value=”#x.odd()”/>|

  是第一个元素吗?<s:property value=”#x.first()”/>|

  是最后一个元素吗?<s:property value=”#x.last()”/>|

</s:iterator>

遍历map

<s:iterator value=”#{1:’a’,2:’b’,3:’c’}”>

  <s:property value=”key”/>|<s:property value=”value”/><br/>

</s:iterator>

遍历map+变量

<s:iterator value=”#{1:’a’,2:’b’,3:’c’}” var=”x”>

  <s:property value=”#x.key”/>|<s:property value=”#x.value”/><br/>

</s:iterator>

 

 

 

 

date:<s:property value=”d”><br/>

<s:date name=”d” format=”yyyy/MM/dd HH:mm:ss/>struts自带的日期格式化

浏览器中list传值:?interestsmath*interests=english

浏览器中map传值:?users[‘a’]=usera& users[‘b’]=userb

然后在页面中取值

<s:property value=”interests”/><br/>

<s:property value=”users”/>

5.      动态方法调用:在浏览器中”感叹号+方法名”

6.      在1.5里面实现的实现interface不能写@override(一个bug)

7.      关于action:
Action属性的不同将它分为两类:Field-Driven(属性驱动) Action和Model-Driven(模型驱动) Action
action中属性设置:
第一种方式:直接在action中写属性,用?name=”a”&age=”1”的方式传入
第二种方式:建一个类抽象出属性.用?user.name=a&user.age=1传入
第三种方式:action实现ModelDriven<User>这个接口,传值同方式一
     在action中要一个private User user = new User()对象;
     还要覆写getModel()方法

8.      addFiledError(name,value)添加错误信息到value statck,虽然好用但是格式难控制.一般就自己写css或者重写它自己的css类.或者自定义自己的模板.
用<s:property value=”errors.name[0]”>可以取出添加的错误信息
用<s:debug></s:debug>可以查看value statck信息

在action中取得request,session,application对象有四种方式

①:
定义属性:

private Map request

private Map session

private Map application


在构造方法中使用

request=(Map)ActionContext.getContext().get(“request”);

session=ActionContext.getContext().getSession();

application=ActionContext.getContext().getApplication();

②implements RequestAware, SessionAware,ApplicationAware(常用)

定义属性:

private Map<String,Object >request;

private Map<String,Object >session;

private Map<String,Object >application;

加入setter和getter

覆写方法

setRequest();setSession();setApplication();

③定义属性

private HttpServletRequest request;

private HttpSession session;

private ServletContext application;

构造方法初始化

request=ServletActionContext.getRequest();

session=request.getSession();

application=session.getServletContext()

④implements ServletRequestAware

定义属性

private HttpServletRequest request;

private HttpSession session;

private ServletContext application;

覆写方法:

@override

public void setServletRequest(HttpServletRequest request){

this.request=request;

this.session=request.getSession();

this.application=session.getServletContext();

}


ServletRequestAware这个接口中的方法是setServletRequest(HttpServletRequest request) 可以获得这次请求的request对象

RequestAware这个接口中的方法是setRequest(Map request) 它只能够获得这次请求中包含request对象中全部attributes的一个map对象

public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {

    private HttpServletRequest request;

    private HttpServletResponse response;

    public void setServletRequest(HttpServletRequest request) {

        this.request = request;

    }

    public void setServletResponse(HttpServletResponse response) {

        this.response = response;

    }

    public String execute() {

        HttpSession session = request.getSession();

        return SUCCESS;

    }

}

 培训的时候写的一个代码

public class VsServlet3 implements ServletRequestAware, ServletResponseAware {

    private HttpServletRequest request;

    private HttpServletResponse response;

    private ServletContext application;

    private HttpSession session;

    // 方式一:ActionContext

    public String scope() {

       ActionContext.getContext().put("request", "request");

       ActionContext.getContext().getSession().put("session", "session");

        ActionContext.getContext().getApplication().put("application","application");

       return "success";

    }

    // 方式二:ServletActionContext

    public String scope2() {

       ServletActionContext.getServletContext().setAttribute("applicaiton",

              "application");

       ServletActionContext.getRequest().setAttribute("request", "request");

       ServletActionContext.getRequest().getSession().setAttribute("session",

              "session");

       return "success";

    }

    // 方式三.倚靠继承的接口,继承这个接口struts框架会在指定动作之前将对象的Servlet对象注入进来

    @Override

    public void setServletRequest(HttpServletRequest request) {

       this.request = request;

       this.session=request.getSession();

       this.application=session.getServletContext();

    }

    @Override

    public void setServletResponse(HttpServletResponse response) {

       this.response = response;

    }

}

 

9.      ongl表达式:略

10.上传下载

下载:action中

public class DownloadAction extends ActionSupport {

    private InputStream is;

    public InputStream getIs(){

       return is;

    }

    public String execute(){

       //下载文件

       //得到文件的真实路径

       String realPath = ServletActionContext.getServletContext().getRealPath("/images/3.jpg");

       try {

           is = new FileInputStream(new File(realPath));

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       }

       return SUCCESS;

    }

}

struts.xml

    <action name="download" class="xxxxx.xxx.xxx">

           <result type="stream">

           <param name="inputName">is</param>

           <param name="contentDisposition">attachment;filename=1.jpg</param>

           <param name="bufferSize">1024</param>

           <param name="contentType">application/octet-stream</param>

           </result>

       </action>

上传:action

private File image;// 文件

    private String imageFileName;// 文件名

    private String imageContentType;// 文件类型

public String execute() {

       ActionContext.getContext().put("message","上传成功");

       // 保存路径

       String realSavePath = ServletActionContext.getServletContext()

              .getRealPath("/images");

       // 实例化文件

       File file = new File(realSavePath,imageFileName);

       if (!file.exists()) {

           file.mkdirs();

       }

       try {

           FileUtils.copyFile(image, file);

       } catch (IOException e) {

           e.printStackTrace();

       }

       return "success";

    }

 

 

11.  sturts设计约定(编码规定)

a)      原则:简单就是美

b)      库名:项目名

c)      表:_Modle名

d)      字段:保持和属性名一直,要避免同关键字相同

e)      用层划分包
                      action层
                      model(bean)层
                      dto(vo)层

12.  开发大致过程

a)      建立界面原型

b)      建立struts.xml

                    i. 确定namespace

                   ii. 确定package

                  iii. 确定action名称

                  iv. 确定result

                   v. 修改界面原型

                  vi. 测试

c)      建立数据库(或者实体类)

d)      建立Model层

e)      建立Service层

最后

以上就是还单身八宝粥为你收集整理的struts2知识总结的全部内容,希望文章能够帮你解决struts2知识总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部