最近忙于上海东方有线的项目,客户需要一些下拉框的局部刷新功能,我参看了其他同事的代码,发现并未实现数据的异步传输,而是采用from局部提交的方式。以下是整理出来的经典下拉列表局部刷新功能Example的部分关键代码,采用了两种方式:localRefresh_1.jsp的功能全部自己手动编写;localRefresh_2.jsp采用prototype.js的方法。
createXHR.js:(创建XMLHttpRequest)
- function createXMLHttpRequest() {
- var xmlHttp;
- if(window.ActiveXObject) {
- xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- else if(window.XMLHttpRequest) {
- xmlHttp = new XMLHttpRequest();
- }
- return xmlHttp;
- }
startRequest.js:(向服务器发送数据)
- function startRequest_get(xmlHttp, url) {
- xmlHttp.onreadystatechange = handleStateChange;
- xmlHttp.open("GET", url, true);
- xmlHttp.send(null);
- }
- function startRequest_post(xmlHttp, url, parameter) {
- xmlHttp.open("POST", url, true);
- xmlHttp.onreadystatechange = handleStateChange;
- xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
- xmlHttp.send(parameter);
- }
localRefresh_1.jsp:(自己编写JS)
- <%@ page contentType="text/html" pageEncoding="UTF-8"%>
- <%
- String path = request.getContextPath();
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'test.jsp' starting page</title>
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- <script type="text/javascript" src="<%=path%>/js/createXHR.js"></script>
- <script type="text/javascript" src="<%=path%>/js/startRequest.js"></script>
- <script type="text/javascript">
- <!--
- var xmlHttp = createXMLHttpRequest();
- function startRequest() {
- var parameterStr = "languageType=" + document.getElementById("langeuage").value;
- startRequest_post(xmlHttp, "<%=path%>/getAndPostExample.do", parameterStr);
- }
- function handleStateChange(){
- if(xmlHttp.readyState == 4) {
- if(xmlHttp.status == 200 || xmlHttp.status == 0) {
- getSecondList();
- }
- }
- }
- function getSecondList() {
- document.getElementById("second").innerHTML = xmlHttp.responseText;
- }
- //-->
- </script>
- </head>
- <body>
- <br>This is my JSP page. <br>
- <input type="button" value="button">
- <br>
- <select id="langeuage" onchange="startRequest()">
- <option value="0">please</option>
- <option value="1">Java</option>
- <option value="2">C/C++</option>
- <option value="3">Perl</option>
- <option value="4">.net</option>
- </select>
- <div id="second" style="display:inLine">
- <select id="languageDesc">
- <option value="0">please</option>
- <option value="1_1">J2SE</option>
- <option value="1_2">J2EE</option>
- <option value="1_3">J2ME</option>
- <option value="2_1">C90</option>
- <option value="2_2">C99</option>
- <option value="2_3">C++</option>
- <option value="3_1">perl</option>
- <option value="4_1">VB</option>
- <option value="4_2">VC</option>
- <option value="4_3">C#</option>
- </select>
- </div>
- </body>
- </html>
localRefresh_2.jsp:(利用prototype.js实现局部刷新)
- <%@ page contentType="text/html" pageEncoding="UTF-8"%>
- <%
- String path = request.getContextPath();
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'test.jsp' starting page</title>
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- <script type="text/javascript" src="<%=path%>/js/prototype-1.4.0.js"></script>
- <script type="text/javascript">
- <!--
- function startRequest(){
- var url = '<%=path%>/getAndPostExample.do';
- var pars = "languageType=" + $F("langeuage");
- var myAjax = new Ajax.Updater(
- 'second',
- url,
- {
- method: 'post',
- parameters: pars
- });
- }
- //-->
- </script>
- </head>
- <body>
- This is my JSP page. <br>
- <input type="button" value="button">
- <br>
- <select id="langeuage" οnchange="startRequest()">
- <option value="0">please</option>
- <option value="1">Java</option>
- <option value="2">C/C++</option>
- <option value="3">Perl</option>
- <option value="4">.net</option>
- </select>
- <div id="second" style="display:inLine">
- <select id="languageDesc">
- <option value="0">please</option>
- <option value="1_1">J2SE</option>
- <option value="1_2">J2EE</option>
- <option value="1_3">J2ME</option>
- <option value="2_1">C90</option>
- <option value="2_2">C99</option>
- <option value="2_3">C++</option>
- <option value="3_1">perl</option>
- <option value="4_1">VB</option>
- <option value="4_2">VC</option>
- <option value="4_3">C#</option>
- </select>
- </div>
- </body>
- </html>
GetAndPostExample.java:(重写doPost和doGet,将结果写入jsp)
- package common;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class GetAndPostExample extends HttpServlet{
- /**
- *
- * @param request
- * @param response
- * @param method
- * @throws IOException
- */
- public void poressRequest(HttpServletRequest request, HttpServletResponse response,
- String method) throws IOException {
- response.setContentType("text/html");
- String languageType = request.getParameter("languageType");
- PrintWriter out = response.getWriter();
- out.print(new CreateLanguageDesc().getLanguateDesc(languageType));
- out.close();
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
- poressRequest(request, response, "GET");
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
- poressRequest(request, response, "Post");
- }
- }
CreateLanguageDesc.java(业务逻辑,组织数据)
- package common;
- /**
- * This class user for chose language and translate the result into HTML
- * @author ibm
- *
- */
- class CreateLanguageDesc {
- /**
- *
- * @param languateType
- * @return
- */
- String getLanguateDesc(String languateType) {
- StringBuffer select = new StringBuffer();
- StringBuffer options = new StringBuffer();
- select.append("<select id='languageDesc'>");
- if(languateType == null || languateType.equals("")) {
- createPlease();
- }
- else if(languateType.equals(LanguateType.JAVA)) {
- options.append(createJava());
- }
- else if(languateType.equals(LanguateType.C)) {
- options.append(createC());
- }
- else if(languateType.equals(LanguateType.Perl)) {
- options.append(createPerl());
- }
- else if(languateType.equals(LanguateType.NET)) {
- options.append(createNet());
- }
- else {
- options.append(createAll());
- }
- select.append(options);
- select.append("</select>");
- return select.toString();
- }
- /**
- * create please options
- * @return
- */
- private StringBuffer createPlease() {
- StringBuffer options = new StringBuffer();
- options.append("<option value='0'>Please</option>");
- return options;
- }
- /**
- * create javaDesc options
- * @return
- */
- private StringBuffer createJava() {
- StringBuffer options = new StringBuffer();
- options.append("<option value='1_1'>J2SE</option>");
- options.append("<option value='1_2'>J2EE</option>");
- options.append("<option value='1_3'>J2ME</option>");
- return options;
- }
- /**
- * create C/C++Desc options
- * @return
- */
- private StringBuffer createC() {
- StringBuffer options = new StringBuffer();
- options.append("<option value='2_1'>C90</option>");
- options.append("<option value='2_2'>C99</option>");
- options.append("<option value='2_3'>C++</option>");
- return options;
- }
- /**
- * create PerlDesc options
- * @return
- */
- private StringBuffer createPerl() {
- StringBuffer options = new StringBuffer();
- options.append("<option value='3_1'>Perl</option>");
- return options;
- }
- /**
- * create .netDesc options
- * @return
- */
- private StringBuffer createNet() {
- StringBuffer options = new StringBuffer();
- options.append("<option value='4_1'>VB</option>");
- options.append("<option value='4_2'>VC</option>");
- options.append("<option value='4_3'>C#</option>");
- return options;
- }
- /**
- * create all of languageDesc options
- * @return
- */
- private StringBuffer createAll() {
- StringBuffer options = new StringBuffer();
- options.append(createPlease());
- options.append(createJava());
- options.append(createC());
- options.append(createPerl());
- options.append(createNet());
- return options;
- }
- }
相比之下,localRefresh_2.jsp的代码要简单的多,多利用开源工具不仅提高了效率,还提高了可读性。