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层

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值