学习struts2+json简单示例(适于初学json者)

一、搭建struts2环境。

    无非就是web.xml、struts.xml文件的配置,添加struts2所需要的jar包。

二、配置json环境。

   下载jsonplugin.jar(我用的是jsonplugin-0.30.jar)、json.js、prototype.js。

    并将jsonplugin.jar放到\WebRoot\WEB-INF\lib目录下,json.js、prototype.js放到\WebRoot\script目录下。

三、程序目录结构及源码。

    1、目录结构



    2、web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.FilterDispatcher
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
</web-app>

    3、struts.xml:

<!DOCTYPE struts PUBLIC  
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
        "http://struts.apache.org/dtds/struts-2.0.dtd">   
<struts>   
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <package name="default" extends="json-default">
        <action name="validateName" class="org.fuzk.demo.ValidateNameAction" >
            <result type="json" />
        </action>       
    </package>
</struts>

    在struts.xml文件中有两个值得注意的地方:
    第一个地方是配置 struts.i18n.encoding 常量时,不再是使用 GBK 编码,而是 UTF-8 编码,这是
因为 Ajax 的POST 请求都是以 UTF-8的方式进行编码的。
    第二个地方是配置包时,自己的包继承了 json-default 包,而不再继承默认的 default 包,这是
因为只有在该包下才有 json 类型的Result。

    3、login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>struts2&json</title>

    <script type="text/javascript" src="script/json.js" ></script>
    <script type="text/javascript" src="script/prototype.js"></script>
    <script language="JavaScript" >
    function validateName() {    
        var url = 'validateName.action';
        var params = Form.Element.serialize('userBean.userName');
        var myAjax = new Ajax.Request(
        url,
        {
            method:'post',
            parameters:params,
            onComplete:processResponse,
            asynchronous:true
        });
    }   
    function processResponse(request) { 
        var jsonObje = eval('('+request.responseText+')');   //此处也可以为var jsonObje = request.responseText.parseJSON();  parseJSON()

                                                                                        //函数在json.js文件中定义
        $("tip").innerHTML = jsonObje.tip;
        $("tip2").innerHTML = '欢迎您,'+jsonObje.userBean.userName; //此处在《struts2入门教程.pdf》中为$("tip2").innerHTML='欢迎

                                                                                                      //您,'+JSON.stringify(jsonObje.userBean.name);
    }
    </script>
  </head>
 
  <body>
    <span id="tip" style="color: red; font-weight: bold" ></span>
    <br/>
    <span id="tip2" style="color: red; font-weight: bold" ></span>
    <form action="" method="post" name="form">
        <fieldset>
            <legend>
                用户登录
            </legend>
            <p align="center">
                帐&nbsp;号:
                <input type="text" name="userBean.userName" onblur="validateName();" />           
            </p>       
        </fieldset>
    </form>
  </body>
</html>

    4、ValidateNameAction.java

package org.fuzk.demo;

import com.googlecode.jsonplugin.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;

public class ValidateNameAction extends ActionSupport {
    
    private UserBean userBean;
    private String   tip;
    @JSON
    public UserBean getUserBean() {
        return userBean;
    }
    public void setUserBean(UserBean userBean) {
        this.userBean = userBean;
    }
    @JSON
    public String getTip() {
        return tip;
    }
    public void setTip(String tip) {
        this.tip = tip;
    }
    
    public String execute() {
        try {
            if ( validateName(userBean)) {
                tip = "你好!" + userBean.getUserName() + ", 这个用户名可用!";
            //    tip = "Hello!" + userBean.getUserName() + ",this username is OK!";
            } else {
                tip = "系统中已有" + userBean.getUserName() + "用户名,请重新选择一个!";
            //    tip = "Sorry, "+userBean.getUserName()+" is used. Please choose other.";
            }
        } catch ( Exception e) {
            tip = e.getMessage();
        }
        
        return SUCCESS;
    }
    
    public boolean validateName( UserBean userBean) {
        if ( "fuzk".equals(userBean.getUserName()))
            return false;
        else
            return true;
    }

}

    5、UserBean.java

package org.fuzk.demo;

public class UserBean {
    
    private String userName;
    
    
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
}

四、遇到的问题

    在调试过程中遇到一个问题,就是在function processResponse(request) 函数中,request.responseText的值被截断,导致程序执行失败。将ValidateNameAction.java文件中的tip值修改成英文字符串时,则执行成功。由此认为是编码问题。接着查找资料,修改编码方式。将struts.xml文件中的编码方式修改为utf-8,将整个项目的编码方式修改为utf-8。最终还是不行,看来不完全是编码问题。继续在网上查找资料,说是jsonplugin.jar版本问题,于是下了一个jsonplugin-0.30.jar,替换掉原来用的jsonplugin-0.7.jar,问题解决!

    另外,本文中红色字体标注位置按照教程中的写法也有问题,程序在此处执行失败,查找资料后,修改为现在的代码,执行成功。

你可能感兴趣的:(学习struts2+json简单示例(适于初学json者))