如何评价Jfinal,Jpress

html-css019

如何评价Jfinal,Jpress,第1张

首先,我是从qbasic开始编程,经历了qb到vb,vb到asp(不带.net),asp到jsp,jsp到php,再回头学习j2ee。这个过程可能导致我的观点可能跟主流观点不同,希望各位理解。

j2ee并不等于spring struts hibernate,还有各种其他的选择,ssh不是唯一甚至不是最好的选择,这里按下不表。

先问一个问题,什么是jsp/servlet不能做,而ssh能做的?没有ssh之前,就没有web应用了么?

有人会觉得servlet傻,可是你看看struts的核心入口Dispatcher,不就是一个Servlet么。你觉得jdbc难用,hibernate的功能最后还是用jdbc实现的,而且不少批量处理的情况,还是原生sql好用,以至于hibernate不得不提供原生sql接口,mybatis正是从这里挖走不少用户。

在很多情况下,ssh做的,只不过是把java/jsp/servlet/jdbc本来就具有的功能,封装成不一样的API,把原先用Java编写的代码变成用XML编写,然后在用java写的解释器在jvm里面去运行这些XML。所以,我觉得ssh其实就是面向web开发这个领域创造出来的一组DSL(领域特定语言)。而这套语言以XML开始,现在转移到java的注解annotation,慢慢的又回归java语言本身。

不太全面的说,struts就是给不熟悉html/css/js的web程序员摆脱它们写业务逻辑用的,hibernate就是给不熟悉SQL的程序员摆脱SQL写数据库程序用的,spring就是给不熟悉java的接口、反射的程序员摆脱接口反射写AOP用的。而上面被代替的这些,恰恰是相关领域的原生DSL,这里面多少有一点讽刺的意味,对么?

如果struts的开发者没有在jsp混杂java片段的各种<%="'"+xx.yy()+"'"%>嵌套括号引号海里面摸爬滚打过来,你觉得他们会想到要做struts么?

如果hibernate的开发者没有在SQL的join链中绕晕过,他们会搞hibernate?

如果spring的开发者没有对java反射的异常数量吐过槽,会有spring?

如果你只想做一个平庸的码农,去学ssh能让你找到一份不错的入门工作。

如果你希望能深入的理解系统、语言、框架,去学习语言本身提供的功能,去学习servlet、jdbc、java,去看看如何用他们构造通用的复杂的系统,也许未来5-10年,人们再提起j2ee,说的就是你创造的框架的名字,而不再是什么spring struts hibernate。

我们总是希望高内聚低耦合,但两者通常是矛盾的;如果你愿意放弃其中的一个,就可以在另一个上面走的更远。

jsp或html页面引用外部.css或.js文件时,注意路径问题,如果设置不当,会引用不到这些外部的文件

假设使用下面的目录结构:

-webapp 

|-MyProject  目录

|--WebContent 目录

|---scripts 目录

---dtree.js 文件

|---styles 目录

---main.css 文件

|---pages 目录

---test.jsp 文件

现在例如要在test.jsp中引用scripts目录下的dtree.js和styles目录下的main.css

有如下几种方法:

1.使用相对于jsp页面的相对路径

Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]

<link type="text/css" rel="stylesheet" href="../styles/main.css" />

<script type="text/javascript" src="../scripts/dtree.js"></script>

<link type="text/css" rel="stylesheet" href="../styles/main.css" /><script type="text/javascript" src="../scripts/dtree.js"></script>

这样在页面使用http://localhost:8080/MyProject/test.jsp访问test.jsp时就可以引用到dtree.js和main.css。

2.使用相对于Web工程的相对路径

对于1中的相对使用相对于于jsp页面的相对路径的这种方式,如果我们是设置action跳转到test.jsp页面,那么这种使用相对路径的方式就引用不到了。

例如我们当访问http://localhost:8080/MyProject/main.do的时候,页面跳转到test.jsp页面,如果使用方法1,就引用不到了。

这个时候我们可以使用相对于Web工程的相对路径来引用: 

Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]

<link type="text/css" rel="stylesheet" href="styles/main.css" />

<script type="text/javascript" src="scripts/dtree.js"></script>

<link type="text/css" rel="stylesheet" href="styles/main.css" /><script type="text/javascript" src="scripts/dtree.js"></script>

但是请注意:使用方法2这种方式引用,如果直接访问http://localhost:8080/MyProject/test.jsp,是引用不到的。

3.使用Web工程的绝对路径

方法1和方法2都有缺点,都只适用一种情况,有没有两种情况都适用的呢?答案肯定的!

我们使用绝对路径:

Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]

<link type="text/css" rel="stylesheet" href="/MyProject/styles/main.css" />

<script type="text/javascript" src="/MyProject/scripts/dtree.js"></script>

<link type="text/css" rel="stylesheet" href="/MyProject/styles/main.css" /><script type="text/javascript" src="/MyProject/scripts/dtree.js"></script>

这样,不管是通过http://localhost:8080/MyProject/main.do跳转访问test.jsp还是直接访问http://localhost:8080/MyProject/test.jsp,都可以成功引用。

注意:如果我们在部署Web应用时,没有设置Context Root(一般情况下配置为工程名),也就是IP和端口后面不带应用名,如http://localhost:8080/main.do和http://localhost:8080/test.jsp,这种情况在引用时就不能带工程名了,应该这样:

Html代码 [url=http://javatechnology.javaeye.com/blog/577469#][/url]

<link type="text/css" rel="stylesheet" href="/styles/main.css" />

<script type="text/javascript" src="/scripts/dtree.js"></script>

<link type="text/css" rel="stylesheet" href="/styles/main.css" /><script type="text/javascript" src="/scripts/dtree.js"></script>

以新增用户为例,这是jsp部分代码。

<%@ page language="java" contentType="text/htmlcharset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>新增用户</title>

<link rel="stylesheet"

href="${pageContext.request.contextPath}/common/css/plantform/common.css"

type="text/css" />

<script type="text/javascript"

src="${pageContext.request.contextPath}/common/js/jquery-1.7.js"></script>

<script type="text/javascript"

src="${pageContext.request.contextPath}/common/js/jquery.artDialog.js?skin=blue"

charset="UTF-8"></script>

<script type="text/javascript"

src="${pageContext.request.contextPath}/common/js/iframeTools.js"

charset="UTF-8"></script>

<link

href="${pageContext.request.contextPath}/common/css/plantform/list.css"

rel="stylesheet" type="text/css" />

<link

href="${pageContext.request.contextPath}/common/css/plantform/index.css"

rel="stylesheet" type="text/css" />

<script type="text/javascript">

function getOrgInfo() {

art.dialog.open('./orgnization/show_org_dbselect', {

title : '选择归属地域',

width : 300,

height : 600,

lock : true,

}, false)

}

function doAddUser() {

var orgId = $("#orgId").val()(通过id获取页面输入的值)

var userName = $('#userName').val()

var loginName = $("#loginName").val()

var password_f = $("#password_f").val()

var password_s = $("#password_s").val()

var userRole = $('#userRole').val()

var phoneNum = $('#phoneNum').val()

if (password_f == null || password_f == '') {

alert('请输入登录密码!')

return false

}

if (password_s == null || password_s == '') {

alert('请输入确认密码!')

return false

}

if (password_s != password_f) {

alert('密码不一致,请重新输入!')

return false

}

if(orgId == null||orgId == ''){

alert('请选择用户所属地域!')

return false

}

(这边就是ajax局部刷新)

$.ajax({

type : "POST",

url : "../user/do_add_Customer",(要跳转的action)

async : false,

data : {

"userName":userName,

"loginName":loginName,

"password":password_f,

"orgId":orgId,

"userRole":userRole,

"phoneNum":phoneNum

},

success : function(data) { (action处理完后返回的结果,就是局部刷新,页面不跳转)

var obj = eval('('+data+')')

if(obj.RESULT=='ok'){

alert("用户信息设置完成!")

art.dialog.opener.$('#orgId').val(orgId)

art.dialog.close()

}else if(obj.RESULT=='repeatUser'){

alert("用户登录名重复!")

}else{

alert("系统异常!")

}

}

})

}

</script>

</head>

<body>

<input type="hidden" value="" name="orgId" id="orgId" />

<div class="gw_main fh">

<div class="w_input_list fh">

<div class="input_01 w01">用户名</div>

<div class="input_02">

<input type="text" name="userName" id="userName"

class="w13" value="${user.userName}" readonly="readonly"/><font color="red">*</font>

</div>

</div>

<div class="w_input_list fh">

<div class="input_01 w01">登录名</div>

<div class="input_02">

<input type="text" name="loginName" id="loginName"

class="w13" value="${user.loginName}" readonly="readonly"/><font color="red">*</font>

</div>

</div>

<div class="w_input_list fh">

<div class="input_01 w01">登录密码</div>

<div class="input_02">

<input type="password" name="password_f" id="password_f"

class="w13" /><font color="red">*</font>

</div>

</div>

<div class="w_input_list fh">

<div class="input_01 w01">确认密码</div>

<div class="input_02">

<input type="password" name="password_s" id="password_s"

class="w13" /><font color="red">*</font>

</div>

</div>

<div class="w_input_list fh">

<div class="input_01 w01">所属地域</div>

<div class="input_02">

<input type="text" name="orgName" id="orgName"

class="w13" value="" readonly="readonly" /><font color="red">*</font>

</div>

<div class="input_02 w06">

<div class="button fh">

<a href="#" class="fl" onClick="getOrgInfo()"><span>选择</span></a>

</div>

</div>

</div>

<div class="w_input_list fh">

<div class="input_01 w01">用户权限</div>

<div class="input_02">

<select name="userRole" id="userRole" style="float:leftheight:23pxmargin-right:5px">

<option value="1">一般用户</option>

<option value="2">管理员用户</option>

</select>

</div>

</div>

<div class="w_input_list fh">

<div class="input_01 w01">联系电话</div>

<div class="input_02">

<input type="text" name="phoneNum" id="phoneNum"

class="w13" value="${user.phoneNum }" readonly="readonly"/>

</div>

</div>

<div class="w_footer fh">

<div class="aui_buttons fr">

<button class="aui_state_highlight" type="button" onClick="doAddUser()" >确认</button>

</div>

</div>

</div>

</body>

</html>

action部分jsp部分跳转的action

@Action(value = "do_add_Customer")

public String doAddCustomer(){

init()

JSONObject js = new JSONObject()

//检测系统内是否存在此登录名的账号

try{

List<User>userList = this.userControlService.getUserByLoginName(loginName,user.getId())

if(userList!=null&&userList.size()>0){

js.put("RESULT", REPEATUSER)

}else{

//新增机电用户信息

Integer userId = this.userControlService.addCustomer(userName,loginName,password,orgId,userRole,phoneNum)

if(userId!=null&&userId>0){

js.put("RESULT", OK)

js.put("VALUE", userId)

}else{

js.put("RESULT", SYSERROR)

}

}

}catch (Exception e) {

js.put("RESULT", SYSERROR)

}

Response_Writer.writeObject(js)

return null

}

这里是将你处理玩的结果通过json的方式返回给jsp页面,页面在处理。如有问题可以再询问。要想局部刷新ajax方法会就可以了。