1、Java Web框架DIY一,为什么要DIY当前,成熟的java web框架有很多种,我们为什么还要自己弄一个呢?我的看法如下:首先,现在的主流框架过于庞大,使用起来过于繁琐,这一点从ROR给java带来的冲击就能看出来,用ROR开发一个web程序如此简单,反思java,难道我们真的需要那么多复杂的步骤吗?其次,现在的用户越来越追求画面的体验,而java主流框架产生的时间相对比较早,对web2.0的考虑相对少一些,对ajax的封装不足,框架处理这类问题比较笨拙。另外,java框架太注重自身的发展,缺乏和新事物的融合,在某种程度上阻碍了自身的进步。二,DIY的原则第一,简单就是美。围绕解决用户的
2、需求这个核心,方案越简洁高效越好。例如,我们没有必要为了某种形式写一大堆get,set方法。第二,坚持自己认为正确的方向。比如说有人不喜欢SQL,希望把对数据库的操作封装起来,进而实现对数据库产品无依赖的编程,但是,我不这么认为,我喜欢SQL,SQL是高效的,如果把oracle提供的递归查询弃置不用,而是自己编程实现,复杂度不必说了,就执行效率而言,同前者不可同日而语。我认为一个复杂的项目必须针对具体的数据库产品的特性编程,毕竟程序运转中,代码是固定的,而不断变化的是数据,我们必须事先对数据库有足够的重视,而不是事后把责任推给DBA。所以,在我的DIY框架中使用SQL是正常的。第三,博采众长。
3、只要不违反知识产权,很多好的,开源的东西,我们尽可能的采用。当然,使用前你要确定这些东西是安全可靠的。三,DIY举例下面对一个具体的组合框架进行刨析,希望对大家有所启发,起到抛砖引玉的作用。先介绍一下该框架的原理。说白了很简单,就是利用jquery增强画面效果,用json进行数据传递。其实网络中介绍jquery+ajax+json的文章很多,但是,都是说返回一个json,用它的内容渲染页面,我在这里更近了一步,不但回来的是json,传到后台的数据也是json,并在此基础上做了一些封装。需要引入的外部资源:jquery.js,著名的js库;json2.js,js的json工具;org.json,
4、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
5、arryData = new Array(); $(tr:gt(0), dom).each(function() var curRow = new Object(); $(td, $(this).each(function(index) if ($(this).children().is(inputtype=text) curRowindex = $(inputtype=text:eq(0), this).val(); else if ($(this).children().is(inputtype=radio) curRowindex = $(inputtype=radio:eq(0), t
6、his).attr(checked); else if ($(this).children().is(inputtype=checkbox) curRowindex = $(inputtype=checkbox:eq(0), this).attr(checked); else if ($(this).children().is(select) curRowindex = $(select:eq(0), this).val(); else curRowindex = ; ); arryData.push(curRow); ); $.jsonParam.jsonRetndom.attr(id) =
7、 arryData; else if (dom.is(inputtype=text) | dom.is(select) $.jsonParam.jsonRetndom.attr(id) = dom.val(); else if (dom.is(inputtype=checkbox) | dom.is(inputtype=radio) $.jsonParam.jsonRetndom.attr(id) = dom.attr(checked); , passEventToJson: function(even) $.jsonParam.jsonRetn.passEvent = even; , get
8、ParamFromJson: 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往后台传值的使用。 $(document).
9、ready(function()$(#contentdiv).html( );$(#idm).change( function() $.jsonParam.passEventToJson(idm); $.jsonParam.registParaToJson($(#idm); $.jsonParam.ajaxJson(SecondServlet, function(response) $(#contentdiv).empty(); $.each(response, function(entryIdex, entry) $(#contentdiv).append(entryMAIN_DI
10、SH); ); );); $(#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 = ; / $.each(response, function(entryIdex, entry
11、) / htm += / htm += + entry0 + / htm += + entry1 + / htm += + entry2 + / htm += / ); / htm += / $(#ret_table).append(htm); / / ); $(#param).attr(value, $.jsonParam.getParamFromJson(); $(#form1).attr(action, SecondServlet); $(#form1).submit(); return true; ););Whats for Dinner?.M
12、ondayTuesdayWednesdayThursdayFridaySaturday No. content select chk - Calico Tortie Siamese - Calico Tortie Siamese - Calico Tortie Siamese SecondServlet.java,后台Servlet,注意jreq.GetParameterFromJson中的参数,他的命名就是jsp中dom的id名,约定大于配置。package org.demo;import java.io.*;import java.util.*;import javax.servlet.*
13、;import javax.servlet.http.*;import mon.*;/* 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(Ht
14、tpServletRequest 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
15、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)j
16、req.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 mon.*;/* The
17、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
18、); 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 (
19、arrRow.get(3).equals(true) retTable.add(table.get(i); return JsonResponse.GetTable(retTable); 下面是两个公共类,负责request到json,以及json到response的转换任务package mon;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.toS
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1