struts2+ajax+json
在Struts2中使用JSON可以更容易實現數據的異步傳輸。
先做好準備工作:
1.Struts2相關lib, 注意將struts2 lib下面的以json開頭的包也加入到工程。
2.JSON Plugin,它可以將Struts2 Action中的結果直接返回為JSON。下載地址:http://jsonplugin.googlecode.com/files/jsonplugin-0.34.jar (支持struts2.1.6及以上版本)。
3.JQuery,JS的一個lib. 下載地址:http://www.jquery.com (最新版本為1.3.2)。
準備工作都做好之后,我們可以開始了。建一個WEB工程,把相關的包加入到工程。我們需要做的就是三件事:
一、準備一個JSP頁面用于提交ajax請求,這里我使用了JQuery的$.getJSON(url,params,function callback(data))函數提交ajax請求到指定url,并且攜帶參數params,最后用一個回調函數callback處理請求返回結果 data;
二、一個處理請求的Action類,并在struts.xml文件中做相應配置:寫一個action類處理ajax請求數據,并將返回結果封裝成一個 JSONObject對象返回給請求頁面。同時在struts.xml中配置對應action,指明其返回類型為json并使其package的 extends為json-default,并將要返回請求頁面的數據放在名為root的param中,如<param name="root">result</param>。
三、接受請求返回結果:使用JS的eval方法將返回結果data轉換成JSON對象,并處理返回結果。
具體參見以下代碼:
// login.jsp 使用getJSON方法提交ajax請求,并處理請求返回結果。注意請求的url為login.html這是因為我將 struts2.preperties中的struts.action.extension改成了htm,默認為action。l
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ taglib uri="/struts-tags" prefix="s"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title><s:text name="page.title.login" /></title>
- <script type="text/javascript" src="jquery-1.3.2.js"></script>
- <script type="text/javascript" language="javascript">
- $(document).ready(function(){
- $("#login").click(function(){
- login();
- });
- });
- function login(){
- var url = "login.html";
- var params = {"user.logName":$("#name").attr("value"),"user.password":$("#password").attr("value")};
- $.getJSON(url,params,function callback(data){
- // convert to json object
- var user = eval("("+data+")");//
- $("#result").each(function(){
- $(this).html('welcome ,' + user.name);
- });
- });
- }
- </script>
- </head>
- <body>
- <s:actionmessage/>
- <form method="post" id="form"><s:text
- name="user.label.name" />:<input type="textbox" name="user.logName" id="name"
- value='${param["user.logName"]}' /><br>
- <s:text name="user.label.password" />:<input type="password" id="password"
- name="user.password" /><br>
- <input type="button" id="login" value='<s:text name="button.label.login" />' /></form>
- <div id="result">
- </div>
- </body>
- </html>
// struts.xml 注意package的extends屬性與result的type屬性。result為userAction的一個屬性,這里將結果返回給ajax的請求頁面。
- <package name="login" namespace="/" extends="json-default" >
- <action name="login" class="userAction" method="login" >
- <result type="json">
- <param name="root">result</param>
- </result>
- </action>
- </package>
// UserAction.java 只需要看login()方法,另外讀者需要自己增加一個User的實體類用來獲取請求數據。這里我只將user的logName與password封裝到 了一個map以JSONObject的方式返回(因為還有其它空屬性沒必要返回)。也可以直接調用 JSONObject.fromObject(user)將整個user對象返回給JSON。注意最后返回的并不是一個JSONObject對象,而是一 String類型的result。這里的result須與action中的<param name="root">中配置的一致。這里代碼寫的比較簡單,沒有增加對用戶名密碼的驗證。
- package com.word.action;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.word.vo.User;
- import net.sf.json.JSONObject;
- import org.apache.poi.hssf.record.formula.eval.AddEval;
- import org.apache.struts2.components.ActionError;
- import org.apache.struts2.components.ActionMessage;
- import org.apache.struts2.interceptor.validation.JSONValidationInterceptor;
- import com.opensymphony.xwork2.ActionSupport;
- import com.word.service.IUserService;
- public class UserAction extends ActionSupport {
- private User user;
- private String result;
- public String getResult(){
- return result;
- }
- public void setResult(String result){
- this.result = result;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- private IUserService userService;
- public void setUserService(IUserService userService) {
- this.userService = userService;
- }
- public String login() throws Exception {
- Map map = new HashMap();
- map.put("name", user.getLogName());
- map.put("password",user.getPassword());
- JSONObject obj = JSONObject.fromObject(map);
- result = obj.toString();
- return SUCCESS;
- }
- /**
- * get User list
- */
- public List<User> findAll() throws Exception {
- return userService.findAll();
- }
- /**
- * get User by id
- *
- * @param id
- * @throw Exception
- */
- public User getUserById(Long id) throws Exception {
- return userService.getUserById(id);
- }
- /**
- * create User
- *
- * @param user
- * @throw Exception
- */
- public String createUser() {
- clearErrorsAndMessages();
- if(user.getLogName().trim().equals("") ){
- this.addActionMessage(getText("error.user.name"));
- return INPUT;
- }
- if(user.getPassword().trim().equals("") ){
- this.addActionMessage(getText("error.user.password"));
- return INPUT;
- }
- try{
- userService.createUser(user);
- this.addActionMessage(getText("user.message.create"));
- return INPUT;
- }catch(Exception e){
- this.addActionMessage("注冊用戶失敗");
- return INPUT;
- }
- }
- /**
- * update User
- *
- * @param user
- * @throw Exception
- */
- public void updateUser() throws Exception {
- userService.updateUser(user);
- }
- /**
- * delete User by id
- *
- * @param id
- * @throw Exception
- */
- public void deleteUser(Long id) throws Exception {
- userService.deleteUser(id);
- }
- }