`
chengj
  • 浏览: 18065 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

java web框架DIY

阅读更多


一,为什么要DIY
当前,成熟的java web框架有很多种,我们为什么还要自己弄一个呢?我的看法如下:
首先,现在的主流框架过于庞大,使用起来过于繁琐,这一点从ROR给java带来的冲击就能看出来,
用ROR开发一个web程序如此简单,反思java,难道我们真的需要那么多复杂的步骤吗?
其次,现在的用户越来越追求画面的体验,而java主流框架产生的时间相对比较早,对web2.0的考虑相对少一些,
对ajax的封装不足,框架处理这类问题比较笨拙。
另外,java框架太注重自身的发展,缺乏和新事物的融合,在某种程度上阻碍了自身的进步。
二,DIY的原则
第一,简单就是美。围绕解决用户的需求这个核心,方案越简洁高效越好。例如,我们没有必要为了某种形式写一大堆get,set方法。
第二,坚持自己认为正确的方向。比如说有人不喜欢SQL,希望把对数据库的操作封装起来,进而实现对数据库产品无依赖的编程,
但是,我不这么认为,我喜欢SQL,SQL是高效的,如果把oracle提供的递归查询弃置不用,而是自己编程实现,复杂度不必说了,
就执行效率而言,同前者不可同日而语。我认为一个复杂的项目必须针对具体的数据库产品的特性编程,毕竟程序运转中,
代码是固定的,而不断变化的是数据,我们必须事先对数据库有足够的重视,而不是事后把责任推给DBA。所以,在我的DIY框架中
使用SQL是正常的。
第三,博采众长。只要不违反知识产权,很多好的,开源的东西,我们尽可能的采用。当然,使用前你要确定这些东西是安全可靠的。
三,DIY举例
下面对一个具体的组合框架进行刨析,希望对大家有所启发,起到抛砖引玉的作用。
先介绍一下该框架的原理。说白了很简单,就是利用jquery增强画面效果,用json进行数据传递。其实网络中介绍jquery+ajax+json的文章很多,
但是,都是说返回一个json,用它的内容渲染页面,我在这里更近了一步,不但回来的是json,传到后台的数据也是json,
并在此基础上做了一些封装。

需要引入的外部资源:jquery.js,著名的js库;json2.js,js的json工具;org.json,java操作json的类包;sqlitejdbc-v053.jar,
sqlite的jdbc驱动,因为只是做一个demo所以用了一个我知道的最简单的数据库。

json_param.js 算是一个jquery插件。把dom中的内容做成json;包装了一下jQuery.ajax,使其调用更简单。
// Add a dom parameter to json.
$(document).ready(function(){
  jQuery.jsonParam = {
    jsonRetn: new Object(),

    registParaToJson: function(dom){
      if (dom.is("table")) {
        var arryData = new Array();
        $('tr:gt(0)', dom).each(function(){
          var curRow = new Object();
          $('td', $(this)).each(function(index){
            if ($(this).children().is("input[type=text]")) {
              curRow[index] = $('input[type=text]:eq(0)', this).val();
            }
            else if ($(this).children().is("input[type=radio]")) {
              curRow[index] = $('input[type=radio]:eq(0)', this).attr("checked");
            }
            else if ($(this).children().is("input[type=checkbox]")) {
              curRow[index] = $('input[type=checkbox]:eq(0)', this).attr("checked");
            }
            else if ($(this).children().is("select")) {
              curRow[index] = $('select:eq(0)', this).val();
            }
            else {
              curRow[index] = "";
            }
          });
          arryData.push(curRow);
        });
        $.jsonParam.jsonRetn[dom.attr('id')] = arryData;
      }
      else if (dom.is("input[type=text]") || dom.is("select")) {
        $.jsonParam.jsonRetn[dom.attr('id')] = dom.val();
      }
      else if (dom.is("input[type=checkbox]") || dom.is("input[type=radio]")) {
        $.jsonParam.jsonRetn[dom.attr('id')] = dom.attr("checked");
      }
    },

    passEventToJson: function(even){
      $.jsonParam.jsonRetn.passEvent = even;
    },

    getParamFromJson: function(){
      return JSON.stringify($.jsonParam.jsonRetn);
    },

    ajaxJson: function(url, callback){
      return jQuery.ajax({
        type: "post",
        url: url,
        dataType: "json",
        data: {'param':$.jsonParam.getParamFromJson()},
        success: callback
      });
    }

  }
});

first.jsp 一个jsp,注意$.jsonParam.registParaToJson往后台传值的使用。
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
<html>
<head>
    <title></title>
<script src="script/jquery.js" type="text/javascript"></script>
<script src="script/json2.js" type="text/javascript"></script>
<script src="script/json_param.js" type="text/javascript"></script>

<script type="text/javascript">
 $(document).ready(function(){

  $('#contentdiv').html('&nbsp;');
 $("#idm").change( function() {
      $.jsonParam.passEventToJson('idm');
      $.jsonParam.registParaToJson($('#idm'));

      $.jsonParam.ajaxJson("SecondServlet",
        function(response){
          $('#contentdiv').empty();
          $.each(response, function(entryIdex, entry){
            $('#contentdiv').append(entry['MAIN_DISH']);
          });
        }
      );
 });

  $("#b_pass").click( function() {
      $.jsonParam.passEventToJson('b_pass');
      $.jsonParam.registParaToJson($('#idm'));
      $.jsonParam.registParaToJson($('#t_demo'));

      //~ $.jsonParam.ajaxJson("SecondServlet",
        //~ function(response){
          //~ $('#ret_table').empty();
          //~ var htm = '<table border="1">';
          //~ $.each(response, function(entryIdex, entry){
            //~ htm += '<tr>'
            //~ htm += '<td>' + entry['0'] + '&nbsp; </td>'
            //~ htm += '<td>' + entry['1'] + '&nbsp; </td>'
            //~ htm += '<td>' + entry['2'] + '&nbsp; </td>'
            //~ htm += '</tr>'
          //~ });
          //~ htm += '</table>'
          //~ $('#ret_table').append(htm);
        //~ }
      //~ );

      $("#param").attr("value", $.jsonParam.getParamFromJson());
      $("#form1").attr("action", "SecondServlet");
      $("#form1").submit();
      return true;
  });

 });
</script>

</head>
<body>

<DIV id=main>
<form id="form1" method="post" action="">
<div id="databox">
 <select id="idm" >
  <option value="0" selected="selected">What's for Dinner?...</option>
  <option value="1">Monday</option>
  <option value="2">Tuesday</option>
  <option value="3">Wednesday</option>
  <option value="4">Thursday</option>
  <option value="5">Friday</option>
  <option value="6">Saturday</option>
 </select>
 <p id="contentdiv"> </p>
</div>
<div>
  <input type="button" value="pass" id="b_pass" class="test_button" />
  <br />
  <table id="t_demo" border="1">
    <tr>
      <th>No.</th>
      <th>content</th>
      <th>select</th>
      <th>chk</th>
    </tr>
    <tr>
      <td> <input type="radio" name="radio" checked="checked" /></td>
      <td> <input type="text" size="12" /></td>
      <td>
        <select name="Cats" size="1" >
          <option value="0" selected="selected">----</option>
          <option value="1">Calico</option>
          <option value="2">Tortie</option>
          <option value="3">Siamese</option>
          </select>
        </td>
        <td><input type="checkbox" /></td>
  </td>
    </tr>
    <tr>
      <td> <input type="radio" name="radio" /></td>
      <td> <input type="text" size="12" /></td>
      <td>
        <select name="Cats" size="1" >
          <option value="0" selected="selected">----</option>
          <option value="1">Calico</option>
          <option value="2">Tortie</option>
          <option value="3">Siamese</option>
          </select>
        </td>
        <td><input type="checkbox" /></td>
    </tr>
    <tr>
      <td> <input type="radio" name="radio" /></td>
      <td> <input type="text" size="12" /></td>
      <td>
        <select name="Cats" size="1" >
          <option value="0" selected="selected">----</option>
          <option value="1">Calico</option>
          <option value="2">Tortie</option>
          <option value="3">Siamese</option>
          </select>
        </td>
        <td><input type="checkbox" /></td>
    </tr>
  </table>
</div>
<input type="hidden" id="param" name="param"/>
<p id="ret_table"></p>

</form>
</DIV>
</body>
</html>


SecondServlet.java,后台Servlet,注意jreq.GetParameterFromJson中的参数,他的命名就是jsp中dom的id名,约定大于配置。

package org.demo;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.common.*;

/**
 * The simplest possible servlet.
 *
 * @author chengj
 */

public class SecondServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException{
      doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

      String param=request.getParameter("param");
      JsonRequest jreq = new JsonRequest(param);

      String resWrite = "";
      SecondEnty enty = new SecondEnty();
      if ("idm".equals((String)jreq.GetParameterFromJson("passEvent")))
      {
        String key = (String)jreq.GetParameterFromJson("idm");
        resWrite = enty.getDish(key);

        response.setContentType("application/json;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println(resWrite);
      }
      else if ("b_pass".equals((String)jreq.GetParameterFromJson("passEvent"))) {
        resWrite = enty.getDetail((ArrayList)jreq.GetParameterFromJson("t_demo"));

        request.setAttribute("param",resWrite);

        RequestDispatcher rd = request.getRequestDispatcher("/jsp/second.jsp");
        rd.forward(request, response);
      }

    }
}


SecondEnty.java,SecondServlet的业务相关类。
package org.demo;

import java.io.*;
import java.util.*;
import java.sql.*;
import org.common.*;

/**
 * The simplest possible servlet.
 *
 * @author chengj
 */

public class SecondEnty extends DBAccess {

  private Connection conn = null;

  public String getDish(String key) {
    String retJson = null;
    try {
      PreparedStatement prep = super.conn.prepareStatement("SELECT day, main_dish FROM menu where qsid = ?");
      prep.setString(1, key);
      retJson = JsonResponse.GetQuery(prep.executeQuery());
      return retJson;
    } catch(Exception e) {
      System.out.println(e.toString());
      return null;
    }
  }

  public String getDetail(ArrayList table) {
    ArrayList retTable = new ArrayList();
    for (int i = 0; i < table.size(); i++) {
      ArrayList arrRow = (ArrayList)table.get(i);
      if (arrRow.get(3).equals("true")) {
        retTable.add(table.get(i));
      }
    }
    return JsonResponse.GetTable(retTable);
  }

}


下面是两个公共类,负责request到json,以及json到response的转换任务
package org.common;

import java.util.*;
import org.json.*;

/**
 *
 *
 * @author chengj
 */

public class JsonRequest {

    private JSONObject data;

    public JsonRequest(String param){
      try {
        this.data = new JSONObject(param);
      } catch(JSONException e) {
        System.out.println(e.toString());
      }
    }

    public Object GetParameterFromJson(String key) {
      try {
        return GetParameterFromJson(key, data);
      } catch(JSONException e) {
        System.out.println(e.toString());
        return null;
      }
    }

    private Object GetParameterFromJson(String key, JSONObject data) throws JSONException {
      if (data.get(key) instanceof String) {
        return (String)data.get(key);
      }
      if (data.get(key) instanceof Boolean) {
        return ((Boolean)data.get(key)).toString();
      }
      if (data.get(key) instanceof JSONArray) {
        JSONArray dataArray = (JSONArray)data.get(key);
        ArrayList arrTable = new ArrayList();
        for (int i = 0; i < dataArray.length(); i++) {
          JSONObject dataRow = dataArray.getJSONObject(i);
          ArrayList arrRow = new ArrayList();

          for (int j = 0; j < dataRow.length(); j++)
          {
            arrRow.add(GetParameterFromJson(String.valueOf(j), dataRow));
          }
          arrTable.add(arrRow);
        }
        return arrTable;
      }
      return data.get(key);
    }
}


package org.common;

import java.util.*;
import java.io.*;
import org.json.*;
import java.sql.*;

/**
 *
 *
 * @author chengj
 */

public class JsonResponse {

  public static String GetQuery(ResultSet rs) {
    try {
      ResultSetMetaData rsmd = rs.getMetaData();
      StringWriter sw = new StringWriter();
      JSONWriter writer = new JSONWriter(sw);
      writer.array();
      while (rs.next()) {
        writer.object();
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          writer.key(rsmd.getColumnName(i).toUpperCase());
          writer.value(rs.getString(i));
        }
        writer.endObject();
      }
      writer.endArray();
      rs.close();
      return sw.getBuffer().toString();
    } catch(SQLException e) {
      System.out.println(e.toString());
      return null;
    } catch(JSONException e) {
      System.out.println(e.toString());
      return null;
    }
  }


  public static String GetTable(ArrayList tdata){
    try {
      StringWriter sw = new StringWriter();
      JSONWriter writer = new JSONWriter(sw);
      writer.array();
      for (int i = 0; i < tdata.size(); i++) {
        writer.object();
        ArrayList arrRow = (ArrayList)tdata.get(i);
        for (int j = 0; j < arrRow.size(); j++) {
          writer.key(String.valueOf(j));
          writer.value((String)arrRow.get(j));
        }
        writer.endObject();
      }
      writer.endArray();

      return sw.getBuffer().toString();

    } catch(JSONException e) {
      System.out.println(e.toString());
      return null;
    }
  }

}

DBAccess.java,连接数据库的类
package org.common;

import java.util.*;
import java.sql.*;

/**
 *
 *
 * @author chengj
 */
public class DBAccess {

  public Connection conn = null;

 public DBAccess() {
    try {
      Class.forName("org.sqlite.JDBC");
      this.conn = DriverManager.getConnection("jdbc:sqlite:test.db3");
    } catch(ClassNotFoundException e) {
      System.out.println(e.toString());
    } catch(SQLException e) {
      System.out.println(e.toString());
    }
  }

  protected void finalize() {
    try {
      this.conn.close();
    } catch(SQLException e) {
      System.out.println(e.toString());
    }
  }
}


second.jsp,第二个页面
<%@ page language="java" contentType="text/html; charset=utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
<html>
<head>
    <title></title>
<script src="script/jquery.js" type="text/javascript"></script>
<script src="script/json2.js" type="text/javascript"></script>

<script type="text/javascript">
 $(document).ready(function(){
    $('#ret_table').empty();
    var htm = '<table border="1">';
    var objret = JSON.parse('<%= request.getAttribute("param") %>');

    for(i=0; i<objret.length; i++){
      htm += '<tr>';
      htm += '<td>' + objret[i]['0'] + '&nbsp; </td>';
      htm += '<td>' + objret[i]['1'] + '&nbsp; </td>';
      htm += '<td>' + objret[i]['2'] + '&nbsp; </td>';
      htm += '</tr>';
    }
    htm += '</table>'
    $('#ret_table').append(htm);

    $("#b_back").click( function() {
      $("#form1").attr("action", "HelloWorldExample");
      $("#form1").submit();
      return true;
    });
 });
</script>

</head>
<body>
    <form id="form1" method="post" >
      <p>second jsp</p>
      <p id="ret_table"></p>
      <input type="button" value="back" id="b_back" />
    </form>
</body>
</html>

后记:
以上只是一个大概的构思框架,最近没有java的项目,所以也没有机会在实际中使用,完善,所以很简陋。希望有兴趣的朋友补充。

 

 

分享到:
评论

相关推荐

    webshooters:用于开发安全 Java Web 服务的 Web 框架

    PampaNet 网络射手 用于开发安全 Java Web 服务的 Web 框架包含的依赖项 要求Java 8 Maven 3 应用服务器(Tomcat 9(?), Jetty 9 推荐) ##特征符合 Java 8 Servlet 3.x 异步请求和过滤器Google Guice 依赖注入...

    Java商城 免费 开源 CRMEB商城JAVA版,SpringBoot + Maven +

    7. **毕业设计/课程设计**:项目适合做毕业设计或课程设计,说明该系统具有一定的完整性和实用性,能够作为学习Java Web开发、电商系统设计、移动应用开发等领域的实践案例。 8. **源码资源**:提供源码意味着...

    Java Web应用详解.张丽(带详细书签).pdf

    动态网站篇深入讲解Servlet、JSP、JavaBean、JDBC数据库连接、数据库连接池等Java Web开发的核心技术。系统框架篇则是以架构设计的高度,讲解搭建网站的三大框架Struts、Hibernate、Sprin9及标签库。项目实战篇详细...

    web项目开发必备小软件

    至于"系统diy小鬼头2.3",这个名字可能是某个特定工具或框架的版本号,但没有足够的信息来详细解释这个工具。通常,这样的工具可能包括代码编辑器、调试器、版本控制系统(如Git)、构建工具(如Maven或Gradle)、...

    一些Web开发相关工具的DIY.zip

    【标题】: "Web开发工具DIY集合" 在Web开发领域,拥有一套高效、实用的工具至关重要。"一些Web开发相关工具的DIY.zip"这个压缩包很可能包含了一组自定义或定制化的Web开发工具,特别关注JavaScript技术。JavaScript...

    JSP基于SSM蛋糕DIY购物商城网站可升级SpringBoot毕业源码案例设计.zip

    这是一个基于Java Web技术的毕业设计项目,主要使用了JSP(JavaServer Pages)、Spring、SpringMVC和MyBatis(SSM框架)构建了一个蛋糕DIY购物商城网站。该网站可以进一步升级为SpringBoot框架,以提升性能和简化...

    程序员 java

    - **特点**:覆盖了Java开发的多个方面,包括Web开发、桌面应用等。 #### 1.5 Java.net (http://www.java.net) - **概述**:由Sun Microsystems运营的社区网站。 - **特点**:集成了大量的开源项目和技术讨论。 ##...

    JSP基于SSM蛋糕DIY购物商城网站可升级SpringBoot源码案例设计.zip

    这是一个基于Java Web技术的SSM(Spring、SpringMVC、MyBatis)框架实现的蛋糕DIY购物商城网站的源码案例。这个项目不仅提供了一种基础的电子商务平台功能,还融入了DIY定制的元素,增加了用户互动性和趣味性。下面...

    在线装机diy系统

    ASP.NET是微软公司推出的Web应用框架,支持C#或VB.NET编程,适合构建高效、安全的Web应用。JSP(Java Server Pages)是Java平台上的动态网页技术,结合HTML和Java代码,用于生成动态内容。JAVA作为后端语言,具有跨...

    最简单DIY基于ESP32CAM的物联网相机系统②(在JAVAWEB服务器实现图片查看器)

    你可以选择使用Tomcat、Jetty等成熟的Servlet容器,或者Spring Boot这样的全栈框架来创建Web应用。服务器端的核心功能包括接收图片数据,存储到文件系统或者数据库,以及提供图片查看服务。这通常涉及到处理HTTP请求...

    Hipstack:一个时髦的 Java 堆栈

    Hipstack是一个创新且时尚的Java开发框架,它借鉴了jHipster的理念,但又有所不同。jHipster在Java社区中广受欢迎,因为它提供了一个快速应用开发(RAD)环境,集成了前端和后端技术,包括Spring Boot、Angular或...

    2022年JAVA程序员必去的网站域名服务器教程.docx

    13. **Java服务器端技术探讨 (http://www.theserverside.com)**:专门讨论Java服务器端技术,包括Web应用、微服务等。 14. **JARs评论服务 (http://www.jars.com)**:提供Java库的评价和框架、应用程序的资讯。 15...

    智能diy官网小程序后台+4小程序前端.zip

    1. **服务器技术**:可能使用Node.js、Python的Django或Flask、Java的Spring Boot等技术栈搭建服务器。 2. **数据库管理**:可能使用MySQL、MongoDB、SQLite等关系型或非关系型数据库,存储用户信息、商品数据等。 3...

    在线服装定制系统源码

    开发人员需要熟悉Spring Boot、Hibernate、MyBatis等Java Web框架,这些框架用于实现业务逻辑、数据持久化和数据库交互。同时,前端可能采用了诸如HTML、CSS、JavaScript以及React、Vue.js等技术,为用户提供动态、...

    Java资源前后端分离技术,下载可用

    总结而言,这个开源商城系统集成了Java后端技术、前端现代化框架、多平台支持以及丰富的电商特性,是Java程序员开发此类项目的一个理想选择。通过深入学习和理解这个项目,开发者不仅可以提升自己的Java编程能力,还...

    Java程序员面试宝典

    面试时,掌握这些Java核心概念、异常处理机制、Web技术和EJB模型对于成功获得职位至关重要。此外,理解并发、多线程、IO流、设计模式、JVM内存模型、垃圾回收等高级主题也是必不可少的。熟悉Java API的使用,如...

    06-DIY字符画.zip

    我们的项目是一个基于Python语言开发的应用程序,旨在...我们还使用了Django作为全功能的Web开发框架,它提供了一系列的工具和功能,如ORM(对象关系映射)、表单验证、用户认证等,使得开发Web应用更加高效和可靠。

    java电商源码-java-ds:电商项目

    2. **框架使用**:Java电商项目常使用Spring Boot作为基础框架,它简化了项目的配置和启动流程。此外,Spring Cloud可能被用于微服务架构,提供服务注册、发现、负载均衡等功能。MyBatis或JPA可能作为ORM(对象关系...

Global site tag (gtag.js) - Google Analytics