Server Java 四 :如何在用JSF在服务器端处理Ajax请求




服务器端的处理才是整个事件的Key,那么我们来看看整个请求,回复的过程,我们通过下面的图看看我们服务器端的代码怎么样才可以plug in进去:

看了这个图您肯定已经明白了,我们有机会得到客户端发送过来的HTTP请求,得到这个请求,得到请求里面的参数,我们就可以捋起袖子,大干一番了。
我们用什么方式去处理呢,最简单的一个方法是自己写一个servlet,在servlet的Dopost方法里面,写上处理这个请求的代码,并且把结果以XML的方式返回回去,那么我们这里用一个简单的例子:
Java代码 复制代码  收藏代码
  1. public void doPost(HttpServletRequest req, HttpServletResponse res)   
  2.                 throws java.io.IOException {   
  3.   
  4. String action = req.getParameter("action");   
  5. String item = req.getParameter("item");   
  6.   
  7. if ((action != null)&&(item != null)) {   
  8.   
  9.   // Add or remove items from the Cart  
  10.   if ("add".equals(action)) {   
  11.     cart.addItem(item);   
  12.   
  13.   } else if ("remove".equals(action)) {   
  14.     cart.removeItems(item);   
  15.   
  16.   }   
  17. }   
  18.   
  19. // Serialize the Cart's state to XML  
  20. String cartXml = cart.toXml();   
  21.   
  22. // Write XML to response.  
  23. res.setContentType("application/xml");   
  24. res.getWriter().write(cartXml);   
  25. }  
public void doPost(HttpServletRequest req, HttpServletResponse res)
                throws java.io.IOException {

String action = req.getParameter("action");
String item = req.getParameter("item");

if ((action != null)&&(item != null)) {

  // Add or remove items from the Cart
  if ("add".equals(action)) {
    cart.addItem(item);

  } else if ("remove".equals(action)) {
    cart.removeItems(item);

  }
}

// Serialize the Cart's state to XML
String cartXml = cart.toXml();

// Write XML to response.
res.setContentType("application/xml");
res.getWriter().write(cartXml);
}

  这对于了解服务器端编程的人来说,是最简单不过的了。当然,我们用了JSF框架,肯定不会再通过Servlet技术去做这件事情。我们这里用JSF的PhaseListener进行处理。什么是PhaseListener,我们来看一下PhaseListener的JavaDoc:
Java代码 复制代码  收藏代码
  1. public interface PhaseListener   
  2.   
  3.   
  4. extends java.util.EventListener, java.io.Serializable   
  5.   
  6.   
  7. An interface implemented by objects that wish to be notified at the beginning and ending of processing for each standard phase of the request processing lifecycle.  
public interface PhaseListener


extends java.util.EventListener, java.io.Serializable


An interface implemented by objects that wish to be notified at the beginning and ending of processing for each standard phase of the request processing lifecycle.



  原来,这个接口捕捉到每个Request的声明周期,在请求开始处理和请求处理结束时我们可以插入我们自己的代码。这个接口的两个最重要的方法如下:
Java代码 复制代码  收藏代码
  1. void afterPhase(javax.faces.event.PhaseEvent event)    
  2.       Handle a notification that the processing for a particular phase has just been completed. void beforePhase(javax.faces.event.PhaseEvent event)    
  3.       Handle a notification that the processing for a particular phase of the request processing lifecycle is about to begin.  
void afterPhase(javax.faces.event.PhaseEvent event) 
      Handle a notification that the processing for a particular phase has just been completed. void beforePhase(javax.faces.event.PhaseEvent event) 
      Handle a notification that the processing for a particular phase of the request processing lifecycle is about to begin.

处理结束和处理开始两个方法,我们可以在这两个方法里面写入我们自己的代码,对用户过来的请求进行处理。
  比如,我们可以在afterPhase方法里面,插入下面的代码对数据进行处理:
Java代码 复制代码  收藏代码
  1. FacesContext facesContext = phaseEvent.getFacesContext();   
  2.   ExternalContext externalContext = facesContext.getExternalContext();   
  3. Map paramMap = externalContext.getRequestParameterMap();  
FacesContext facesContext = phaseEvent.getFacesContext();
  ExternalContext externalContext = facesContext.getExternalContext();
Map paramMap = externalContext.getRequestParameterMap();

通过paramMap里面可以得到所有的参数,当然,我们并不是对每一个请求都会进行处理,所以,在客户端Javascript发送Ajax请求得时候,可以添加一个自定义的参数,比如我们前面文档中的ajaxdemo=ajaxdemo参数,这样我们可以判断一下当前是不是我们要处理的请求:
Java代码 复制代码  收藏代码
  1. private final static String AJAX_DEMO = "ajaxdemo";   
  2.   
  3. if (! AJAX_DEMO.equals(paramMap.get(AJAX_DEMO)))   
  4.     return;  
private final static String AJAX_DEMO = "ajaxdemo";

if (! AJAX_DEMO.equals(paramMap.get(AJAX_DEMO)))
    return;

  接下去的代码,就可以处理我们的各种各样的请求了,我们在这里要举的例子是如何得到当前地图的比例尺。下次讲座再深入探讨吧。
 
 
 
 
 
 
 
 
 
 
 
 
另外一个兄弟的:

Ajax异步处理(服务器返回请求)

xmlhttprequest对象已经创建好了!

 xmlHttp.onreadystatechange=callBack;

 xmlHttp.open("POST","AjaxXML",true); 

xmlHttp.send("username='"+name+"'");

这个是callback方法

function  callBack()
{
    alert(xmlHttp.readyState);
//   接受服务器端返回的数据
//    readyState的值等于4是表示对象与服务器端交互成功的
    if(xmlHttp.readyState == 4)
    {     //status的值等于200,表示http与服务器交互成功
          if(xmlHttp.status== 200)
          {
              //获取服务器端返回的数据
              var domobj=xmlHttp.responseXML;

              var message=domobj.getElementsByTagName("message");
              if(message.length>0)
              var text=message[0];
              else
              document.getElementById("result").innerHTML=xmlHttp.responseText;;
          }

    }

}

 

问题补充  2010-09-07 14:45

这个js访问的是一个servlet,代码如下:

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by IntelliJ IDEA.
 * User: alvin
 * Date: 2010-9-6
 * Time: 20:02:54
 * To change this template use File | Settings | File Templates.
 */
public class AjaxXMLServer extends HttpServlet
{
      public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          request.setCharacterEncoding("gbk");
                  //修改点1---把Content-type改成text/xml  (必须的)
                  response.setContentType("text/xml;charset=gb18030");
                  String name=request.getParameter("username");
                System.out.println(name);
                try{
                       PrintWriter out=response.getWriter();
                    StringBuilder builder=new StringBuilder();
                    builder.append("<message>");
                if(name==null||name.length()==0)
                {      builder.append("您输入的用户名为空,请查证后输入!").append("</message>");
//               out.print("<script>location.href='index.jsp'</script>");
                }else{
                    if(name.equals("mengxi"))
                    {
                           builder.append("您输入的用户名存在,请重新输入!").append("</message>");
               
//                out.print("<a href='index.jsp'>返回</a>");
                    }else
                    {       builder.append("您输入的用户名不存在,恭喜你可以使用!").append("</message>");
                       
//                out.print("<script>alert('您输入的用户名不存在,该用户名可以使用!');</script>");
//                out.print("<script>location.href='index.jsp'</script>");
                    }

                }
                }catch(IOException e)
                    {
                         e.printStackTrace();     
                    }

                 
    }

    public void doGet(HttpServletRequest request,HttpServletResponse response)
    {  try{
       doPost(request, response);
           }catch(Exception e)
        {
           e.printStackTrace();
        }
    }
}

 
另外一个博客:
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ajax请求session超时处理流程 java服务器端处理: SessionValidateFilter中修改: if (ServerInfo.isAjax(request)) { request.setAttribute("statusCode", 301); request.setAttribute("message", "Session timeout!"); response.sendRedirect(response.encodeRedirectURL("/ajaxDone.jsp"); else { response.sendRedirect(response.encodeRedirectURL(this.loginUrl + java.net.URLEncoder.encode(backToUrl, "UTF-8"))); } ajaxDone.jsp页面 <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> { statusCode:${statusCode}, message:"${message}", objectId:"${objectId}" } js客户端处理ajax load页面碎片处理: 自己写一个loadUrl()方法,不能使用jquery自带的load(). 当客户端调用loadUrl()超时,弹出一个登录框,并加一个背景层下面的整个浏览器.这时浏览器窗口内容不能变,只是上面加了一个登录框和一个背景层 当用户输入username and password登录成功后,去掉登录框和背景层.这时用户可以继续操作. 登录失败alert出错信息,浏览器窗口内容还是不变. var DWZ = { loginUrl:"/render.do?method=login", ajaxDoneEval:function (json) { //session timeout try{ return eval('(' + json + ')'); } catch (e){ return {}; } } }; (function($){ $.extend({ loadUrl: function(url,data,callback){ var aData = data || {}; aData["timestamp"] = new Date().getTime(); var $this = $(this); $.get(url, aData, function(data){ var json = DWZ.ajaxDoneEval(data); if (json.statusCode==301){ alertMsg.error(json.message, {okCall:function(){ window.location = "/render.do?method=login"; //popLoginWin(); }}); } else { $this.html(data).initUI(); if (jQuery.isFunction(callback)) callback(); } }); } }); })(jQuery); ajax post 表单数据处理: 当客户端ajax提交表单超时, 弹出一个登录框,并加一个背景层下面的整个浏览器. 当用户输入username and password登录成功后,去掉登录框和背景层.这时用户可以继续操作. 登录失败alert出错信息. $.post(form.action, params, callback(json){ if (json.statusCode == 301) { //301 状态表示 session timeout popLoginWin(); }else if (json.statusCode == 300) { //300 状态表示 操作失败 alertMsg.error(json.message); } else if(json.statusCode == 200) { //300 状态表示 操作成功 alertMsg.correct(json.message); } }, "json");
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值