Struts2流程
Web端发起一个request到Struts2action的过程为:首先对提交的表单或者数据进行类型转换,如果转换失败,则action跳转至input所对应的页面,如果没有设置input对应的页面则页面报错。如果转换成功,则已经自动给action的属性赋值了,接下来会调用action中的validate()校验方法,如果校验失败,则同转换失败一样跳转至input所对应的页面,只有校验通过了,才会去执行execute()方法,然后根据返回值跳转到对应的页面。
JSP EL表达式与OGNL表达式
EL表达式 ${username}默认搜索的范围其实为:
${pageScope.username}-->${requestScope.username}-->${sessionScope.username}-->${applicationScope.username}
Struts2中action的属性值,默认范围为request,并且都是保存在Struts2值栈(ValueStack Contents)中的,如果用ActionContext.put(key,value)则该key值保存在栈上下文(StackContext)中,并且范围为request。所以用EL表达式取值${username}与${requestScope.username}的效果是一样的。
OGNL表达式取值:
OGNL表达式一定要在Struts2的标签中才有效,如果是取值栈中的值则可以这样,<s:property value=”username”/>如果是取栈上下文中的值,根据作用范围可以如下取值:<s:property value=”#request.key” />
Struts中namespace的问题
<package name=”default” extends=”struts-default”></package>
如果包没有设置命名空间,则为默认的命名空间。如果有一个这样的请求地址:/a/b/c/hello.action则Struts2的查找路径为,首先在namespace=”/a/b/c”的空间下面找name为hello的action,如果没有找到则会在“/a/b”下找,如果还是没有则会在“/a”下找,如果依然没有找到则会在”/”下找,如果没有找到就到namespace=””的包下找,如果还是没有最后就到默认的命名空间去找。如果始终没有找到就报错了,只要有一个找到了就执行找到的那个action。Struts2表单的写法也推荐用命名空间,例如:<s:form action=”hello” namespace=”/a/b”>
如果表单中没有设置namespace,例如:
<s:form action=”login.action”>则系统首先会到namespace=”/”的命名空间下找,如果没有找到就会到namespace=””的命名空间下找,如果还是没有找到就会到默认命名空间下找。
文件下载时异常问题
异常信息为:Can not find a java.io.InputStreamwith the name [inputStream] in the invocation stack. Check the <paramname="inputName"> tag specified for this action
1、文件路径不对,根本就没有取到文件。这种情况下,可以将获得InputStream的那条语句放在system.out.println()中输出一下,若为null,那就是路径不对了,或者说得准确些就根本没有找到文件。
2、在action中没有写配置文件中"<paramname="inputName">"后面属性的那个get方法。
当以上两种情况都正确的情况下,问题就在这里了:当采用
returnServletActionContext.getServletContext().getResourceAsStream("...") 这种方法获得输入流的时候,要保证文件位置在ServletContext 当中,就是说要在当前的应用上下文中,如果想要获得外部文件 譬如 D盘中的某个文件,那么就要自己创建输入流才可以,如:
File file = newFile("D:\\spring.doc");
InputStream is = newFileInputStream(file);
return is;
Struts2注解
引入jar包:struts2-convention-plugin-2.3.4.1.jar