Struts2学习笔记!
Struts原理简介:http://blog.csdn.net/wfdmd/article/details/367675
struts1:
全局forward是都可以访问的,但是当需要使用forward时,strues自动安就近原则来选择。当局部也有定义时,就按照局部的来转。
Struts(草稿)
http://fatedgar.iteye.com/blog/1489255
Struts1.x教程:配置文件总结
http://jc-dreaming.iteye.com/blog/963784
struts1.X配置文件详解
http://www.cnblogs.com/Fskjb/archive/2010/07/04/1771001.html
struts-config.xml 参数解释
http://woshixushigang.iteye.com/blog/1153768
ActionForward是做什么的?
http://hi.baidu.com/baiduba/item/c0446ee1506a8d18585dd8ff
Struts中的URL传递的问题(forward标签的redirect属性)
http://www.binghe.org/2010/10/struts-forward-and-redirect/
?
?
?
?
3.Struts2还提供了一些命名对象,这些对象没有保存在值栈中,而是保存在ActionContext中,因此访问这些对象需要使用“#”标记。这些命名对象都是Map类型,如下:
parameters
??? 例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。
request
??? 用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.get力Attribute ("userName")。
session
???? 用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。
application:#application.userName或者#application['userName']
attr:用于按page-request-session-application顺序访问其属性
?
4.%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值
<s:set name="foobar" value="#{'foo1':'bar','foo2':'bar2'}" />
不使用%:<s:url value="#foobar['foo1']" /></p>???
?????????????? 结果: #foobar['foo1']
使用%:<s:url value="%{#foobar['foo1']}" /></p>?
或:????? <s:url value="%{#foobar.foo1}" />
?????????????? 结果:bar
?
5.详见:
http://www.blogjava.net/max/archive/2006/12/06/85925.html
?
所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor 。除此之外,大家可能更喜欢继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor 。
import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class AuthorizationInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation ai) throws Exception { Map session = ai.getInvocationContext().getSession(); String role = (String) session.get( " ROLE " ); if ( null != role) { Object o = ai.getAction(); if (o instanceof RoleAware) { RoleAware action = (RoleAware) o; action.setRole(role); } return ai.invoke(); } else { return Action.LOGIN; } }} 6.文件上传:
详细见:http://tmsoft.lsxy.com/index.php?load=read&id=514
multipart/form-data:
这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
Struts2并未提供自己的请求解析器,也就是Struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装,简化了文件上传的代码实现,取消了不同上传框架上的编程差异,更进一步简化了文件上传。
Struts2默认使用的是Jakarta的Common-FileUpload框架 来上传文件,因此,要在web应用中增加两个Jar文件:commons- fileupload-1.2.jar和commons-io-1.3.1.jar。如果要改成其它的文件上传框架,可以修改struts.multipart.parser常量的值为cos/pell,默认值是jakata。并在classpath中增加相应上传组件的类库。
?
<s:form action="fileUpload" method="post" enctype="multipart/form-data"> <s:file name="doc" label="File"/> <s:submit/> <s:form>
?
private File image; / /上传文件域对象 private String imageFileName; / /文件名 private String imageContentType;...get.set方法@Overridepublic String execute() throws Exception {String path=ServletActionContext.getServletContext().getRealPath("/upload"); if(image!=null){ File uploadPath=new File(new File(path),imageFileName); FileUtils.copyFile(image,uploadPath); ActionContext.getContext().put("message", "上传成功"); }else{ ActionContext.getContext().put("message", "上传失败"); } return "success";}?此外,可以在struts.xml中配置上传文件的大小
??? <constant name="struts.multipart.maxSize" value="10701096"/> //最大上传配置成10M
??? 默认的上传大小为2M
?
限制文件上传类型(max单位为K):
<action name="upload" name="code">int type = fileName.lastIndexOf("."); //返回指定字符在此字符串中最后一次出现处的索引String index= fileName.substring(type); //subString(int beginIndex) ?
在success.jsp页中通过<s:property>获得文件的属性:
<s:property value="imageFileName"/><s:property value="imageContentType"/>
?
//自己封装的一个把源文件对象复制成目标文件对象
private void copy(File src, File dec) { InputStream in = null; OutputStream out = null; in = new BufferedInputStream(new FileInputStream(src)); out = new BufferedOutputStream(new FileOutputStream(dec)); byte[] buff = new byte[1024]; while (in.read(buff) > 0)//文件是01字节码,read读到文件末尾返回-1,没读到末尾返回1 { out.write(buff); } }?
思维拓展:如果要上传的文件非常大,如上传的是电影,好几百M ,用web上传一般是不可能难上传成功的,这时候要安装一个插件,类似于应用程序socket ,通过网络通讯上传。
?
文件下载:
http://hi.baidu.com/annleecn/blog/item/e14165074a2c117d0308816e.html
http://wenku.baidu.com/view/69b07c38376baf1ffc4fad78.html
?
判断文件是否是允许上传文件:
?
public static boolean isAllowUp(String logoFileName) {String allowTYpe = "gif,jpg,bmp,swf";if (!logoFileName.trim().equals("") && logoFileName.length() > 0) {String ex = logoFileName.substring(logoFileName.lastIndexOf(".") + 1, logoFileName.length());return allowTYpe.toString().indexOf(ex) >= 0;} else {return false;}}?1