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方法会就可以了。