概述
好吧.总结一下自己的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层
最后
以上就是还单身八宝粥为你收集整理的struts2知识总结的全部内容,希望文章能够帮你解决struts2知识总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复