写代码的一些经验积累(持续更新)
最近出差,有机会在现场看看别人写的一些代码,虽然比较基础感觉还是不错,所以干脆就记录下来。以备下次自己用的时候做个参考。
1、通常需要在Web项目中配置一个首页面作为跳转页面。
<welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
?在index.jsp中再跳转到登录页面
<%RequestDispatcher rd = request.getRequestDispatcher("login/login.jsp");rd.include(request, response);%>?这样配置后访问系统登录页面就不需要输入全部的url,只需要确定应用的名字就可以访问。
2、在LoginController中出错后一般是要重新跳转到登录页面,此时一般就是直接将跳转的路径名注入到LoginController中。
<property name="viewName" value="forward:login/login.jsp" />
?在LoginController中直接将注入的viewName作为视图名即可:
if (!checkCode(req, res)) {model.put("errorPrompt", "验证码错误!");return new ModelAndView(viewName, "model", model);}?如果将来跳转的路径修改了只需要修改配置文件一处就可以。
3、按钮事件不一定非要用Ajax请求,完全可以将按钮放到页面的某个form表单中。
例如:页面上存在一个id为queryForm的表单,通过修改其action属性值请求不同的Controller。
$("#queryForm").attr("action", "cache.html?method=clearLocalCache");$("#queryForm").submit();4、如果CSS不是你的强项,那么建议你使用jqueryUI一些已经做好的样式,这样既节省时间又能达到一个不错的效果。
目前系统中只见过使用jqueryUI的button和dialog组件,其他的组件日后慢慢研究。
5、页面中需要引入外部文件,请用以下路径的形式:
<%String requestURL = request.getRequestURL().toString();String requestURI = request.getRequestURI();String contextPath = request.getContextPath();String base = requestURL.substring(0,requestURL.indexOf(requestURI))+ contextPath;%>
<link rel="stylesheet" href="<%=base%>/css/cache/index.css" type="text/css">
?这样写在部署现场或是项目迁移的时候会避免很多麻烦事。
6、如何实现一个账号只能在一处登陆
创建一个CheckAuthController可以继承Spring中的MutiActionController。写一个校验的方法checkAuth(),在此方法中可以按照一定的业务规则判断用户是否存在多处登陆的情况,返回一个判断的结果。LoginController校验通过后的每一个Controller都继承于判断多处登录的CheckAuthController并调用其中的checkAuth()方法,如果返回值为true,存在多处登陆的情况则立即重定向到登录页面中去,否则进行相应的业务处理。
7、尽量的将显示页面和代码分离,一般JavaWeb项目采用JSP显示数据,可能的话多使用JSTL标签或是JS脚本代码进行数据的展示以及获取,或是自己封装一些标签用于视图层的显示。EL运算符:
类别运算符算术运算符+、-、*、/(或?div)和?%(或?mod)关系运算符==(或?eq)、!=(或?ne)、<(或?lt)、>(或?gt)、<=(或?le)和?>=(或?ge)逻辑运算符&&(或?and)、||(或?or)和?!(或?not)验证运算符empty
代码示例:
<c:if test="${not empty returnMap and returnMap.flag eq 'false'}"> ${returnMap.message } </c:if>8、不要忘记使用JSP容器内的四个不同作用域储存和检索数据。应该记得JSP容器的四个作用域,回顾一下:页面作用域(pageScope)、请求作用域(requestScope)、会话作用域(sessionScope)、应用程序作用域(applicationScope)。
9、去掉html中textarea和input的边框样式:
style='overflow:auto; background-attachment: fixed;background-repeat:no-repeat;border-style: solid;?border-color: #FFFFFF'
input
style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px '
注:去掉textarea的下拉框overflow:hidden
10、控制表格行的长度。
方式一、使用div+css
<div style="width:100px;text-overflow:ellipsis;overflow: hidden;white-space:nowrap;">
? ? ?输入需要控制长度的文本,如果过常自动添加省略号。。。
<div>
方式二、使用jstl标签
<c:choose> <c:when test="${fn:length(maps['LYZT']) > 16}"> <c:out value="${fn:substring(maps['LYZT'], 0, 16)}......" /> </c:when> <c:otherwise> <c:out value="${maps['LYZT']}" /> </c:otherwise></c:choose>?在使用JSTL的时候不要忘记引入标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
11、使用oracle自带函数进行字符串补位。
在数据库中针对字符串的补位操作可以使用lpad和rpad函数。例如学校上课周次默认在25周以内,在排课的时候我们可以使用1表示选中,0表示未选中,周次编号可以使用25个0表示,这样选中的周数和未选中的周数就可以通过01字符串来表示。
?SELECT lpad('1','25','0') FROM dual?
12、javascript去掉字符串中的HTML标签:
function delHtmlTag(str){
?? return str.replace(/<[^>]+>/g,"");//去掉所有的html标记
}
13、Query页面查询防止刷新
attributesText="onsubmit='javascript:return false'"
14、脚本代码中产生Wid
var selectedWid = Epx.GUID();
15、关于oracle截取字符串的操作,今天在项目中遇到一个问题,平台的批量保存在视图模板下无法保存。没有找到原因,索性我自己写代码去保存。保存操作其实是一个更新,主要是记录修改记录的wid和修改后的值。如果传两个list到存储过程中进行遍历,那样效率不是很高。可以将wid和修改后的值拼接在一起用特殊字符$$进行分隔。这样我在存储过程中只需要遍历一次即可,在遍历出拼接的字符串后对字符串进行拆解。
OPEN V_CUR FOR SELECT COLUMN_VALUE AS ZC FROM TABLE(CAST(TO_TABLE(in_wids) AS TAB_STR)); LOOP FETCH V_CUR INTO V_WIDS; EXIT WHEN V_CUR%NOTFOUND; SELECT SUBSTR(V_WIDS, 0, INSTR(V_WIDS, '$', 1, 1) - 1), SUBSTR(V_WIDS, INSTR(V_WIDS, '$', -1, 1) + 1, LENGTH(V_WIDS)) INTO V_WID, V_SCJLDM FROM DUAL; UPDATE T_BYSC_BYSCXSJG g SET g.scjldm = v_scjldm WHERE g.wid = v_wid; END LOOP; CLOSE V_CUR;?这里需要记一下substr()和instr()这两个常用函数。简单的说substr用于截取字符串,具体注意一下它的参数,第一个参数表示需要处理的字符串,然后是截取字符串的开始位置,但是最后一个参数不要想当然的认为是截取字符串的结束位置,而是截取字符串的长度。不注意的话很容易给程序带来不易发现的bug;instr()函数的作用是返回要截取的字符串在源字符串中的位置,其中第一个参数表示源字符串,第二个参数表示目标字符,第三个参数表示从哪个位置开始查找,负数表示从右向左,最后一个参数表示目标字符出现的次数位置。