struts2配合jquery 的ajax实现数据交互及异步加载
inputStream = user.equals("crazyit.org") && pass.equals("leegang")
? new ByteArrayInputStream("恭喜你,登录成功!"
.getBytes("UTF-8"))
: new ByteArrayInputStream("对不起,用户名、密码不匹配!"
.getBytes("UTF-8"));
2.struts.xml中指定返回文件的参数
<result name="success" type="stream">
<param name="contentType">text/html</param>
<param name="inputName">result</param>
</result>
3.jsp中配合jquery的ajax实现数据交互,主要使用$.get()获取数据
$("#loginBn").click(function()
{
$.get("loginPro" , $("#loginForm").serializeArray() ,
function(data , statusText)
{
$("#show").height(80)
.width(300)
.css("border" , "1px solid black")
.css("background-color" , "#efef99")
.css("color" , "#ff0000")
.css("padding" , "20px")
.empty();
$("#show").append("登录结果:" + data + "<br />");
$("#show").show(2000);
},
"html");
});
struts2实现下载中文及用struts.xml控制授权下载
<action name="download" class="org.crazyit.app.action.FileDownloadAction">
<param name="inputPath">\images\疯狂联盟.jpg</param>
<result name="success" type="stream">
<param name="contentType">image/jpg</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">filename="wjc_logo.jpg"</param>
<param name="bufferSize">4096</param>
</result>
</action>
2.授权下载在AuthorityDownloadAction中判断sessoin的用户名是否正确,正确返回success,然后交由struts.xml控制下载。
<action name="download2" class="org.crazyit.app.action.AuthorityDownAction">
<param name="inputPath">\images\wjc_logo.zip</param>
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">filename="wjc_logo.zip"</param>
<param name="bufferSize">4096</param>
</result>
<result name="login">/WEB-INF/content/login.jsp</result>
</action>
struts 的异常处理无需使用try catch块。直接抛出异常给struts框架,交给struts.xml来处理
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException" result="sql"/>
<exception-mapping exception="java.lang.Exception" result="root"/>
</global-exception-mappings>
<action name="login" class="org.crazyit.app.action.LoginAction">
<exception-mapping exception="org.crazyit.app.exception.MyException"
result="my"/>
<result name="my">/exception.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
//jsp中则通过<s:property value="exceptionStack"/>来获取异常值
struts2拦截器在action类的excute方法执行前调用。当返回invocatioin.incoke()时进入下一个拦截器,下面没有拦截器时直接执行excute方法。
1.struts.xml的包中定义拦截器
<package name="lee" extends="struts-default">
<interceptors>
<interceptor name="authority"
class="org.crazyit.app.interceptor.AuthorityInterceptor"/>
</interceptors>
2.在struts.xml的action中使用该拦截器
<action name="viewBook">
<result>/WEB-INF/content/viewBook.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authority"/>
</action>
struts2通过ajax异步传递json数据
1.action中封装请求参数的属性,并set和get来序列化每个参数。
private Map<String , String> map
= new HashMap<String , String>();
private String customName = "顾客";
private String field1;
private transient String field2;
private String field3;
2.struts.xml中指定返回类型
<action name="JSONExample" class="org.crazyit.app.action.JSONExample">
<result type="json">
<param name="noCache">true</param>
<param name="contentType">text/html</param>
</result>
</action>
3.jsp中使用jquery的ajax来获取返回参数,并解析json数组
function gotClick()
{
var url = 'JSONExample.action';
var params = Form.serialize('form1');
var myAjax = new Ajax.Request(
url,
{
method:'post',
parameters:params,
onComplete: processResponse,
asynchronous:true
});
}
function processResponse(request)
{
var res = request.responseText.evalJSON();
alert(res);
for(var propName in res)
{
$("show").innerHTML += propName + " --> "
+ res[propName] + "<br/>";
}
}
1.定义action的不同方法
//为每个action写一个method
<action name="regist" class="org.crazyit.app.action.LoginRegistAction"
method="regist">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
//或使用通配符匹配,避免同一个类,相同的返回类型写多个方法(但此时form表单的action名称需要一致)
<action name="*Action" class="org.crazyit.app.action.LoginRegistAction"
method="{1}">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
2.在Action转入实际的物理视图前通过ActionInvocation的addResultListener方法完成回调。
ActionInvocation invocation = ActionContext
.getContext().getActionInvocation();
invocation.addPreResultListener(new PreResultListener()
{
public void beforeResult(ActionInvocation invocation,
String resultCode)
{
System.out.println("返回的逻辑视图名字为:"
+ resultCode);
invocation.getInvocationContext().put("extra"
, new java.util.Date() + "由"
+ resultCode + "逻辑视图名转入");
}
});
<s:property value="extra"/>
Struts2上传文件及用filter实现文件过滤
2.UploadAction中封装多个上传的文件属性并重写excute方法
@Override
public String execute() throws Exception
{
FileOutputStream fos = new FileOutputStream(getSavePath()
+ "\\" + getUploadFileName());
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0)
{
fos.write(buffer , 0 , len);
}
fos.close();
return SUCCESS;
}
3.struts中对文件过滤
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/png
,image/gif,image/jpeg</param>
<param name="maximumSize">2000000</param>
</interceptor-ref>
struts2输入校验
*Action同目录下 *Action-validata.xml
<validators>
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入名字</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的用户名只能是字母和数字
,且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入密码</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的密码只能是字母和数字
,且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年纪必须在1到150之间</message>
</field-validator>
</field>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>生日必须在${min}到${max}之间</message>
</field-validator>
</field>
</validators>