好吧.总结一下自己的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.ui.theme” value =”simple”/> |
可以使用通配符*和{}占位符进行相应的配置
例子:
<action name=”Student*” class=”temp.StudentAction” method=”{1}”> |
可以使用<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、链接到一个网址。 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层