写在前面,程序开发中有难点,需要花时间去思考,但项目时间是有限的,怎么能在工作中挤出时间思考大问题是关键,我们讲有经验的开发人员为什么好?因为他能提高开发的“命中率”,何为“命中率”?就是根据自己掌握的经验去判断某处代码应该怎么写,不用调试都基本能保证这行代码写出来就是是正确的。我们需要在平时的学习中记住和总结知识,让我们看到某个功能就能写而不用去百度上去搜资料,也不用去看其它某处代码是不是这么写的,随手就能写出,至少要保证大部分简单的功能都能信手拈来,命中率提高了,只要测试一遍即可通过,而不用像大部分人那样每开发一个小功能就要验证一下是不是正确,更有甚者不断反复测试某行代码,一步步设断点调度,明显拖慢速度。所以基本知识我们必需牢记于心。而且要形成自己的代码风格和代码知识库。
1. 在JSP里写java代码必需使用scriptlet标记出来,script是脚本的缩写,let是小程序的缩写,在JPS里有3种。
1.1 <%!%>
定义全局变量,类和方法,不般不用,因为不会在jsp里定义类和方法,
1.2 <%%>
定义局部变量,编写的程序语句等,该标签和<jsp:scriptlet></jsp:scriptlet>作用一样,建议使用<jsp:scriptlet></jsp:scriptlet>,为了代码整洁。只适合取request,session的数据再做逻辑,而像ModelAndView传的数据没办法取然后使用。
1.3 <%=表达式%>
输出变量值,虚拟机会把表达式求值转化成String,所以该标签可以放在任何地方,不区别是不是HTML标签。jsp里强烈建议使用该标签而不使用out.println();。
2.jsp里导入class命令:<%@pageimport=”类路径”%>
3.编码方式设置:
使用contenType指定MIME类型,即服务器发给客户端的内容编码,比如contenType=”text/html,charset=GBK”,通过指定MIME类型可以指定浏览器处理返回的页面的处理方式,比如视做html显示,比如当做doc文件下载等,而pageEncoding是JSP页面本身的编码,比如pageEncoding=”UTF-8”,一般JSP开头都是:<%@pagelanguage=”java” contenType=”text/html,charset=UTF-8” pageEncoding=”UTF-8”%>.
ps:在Tomcat /conf/web.xml里有MIME类型,使用频率较少。
4.引入外部文件:
静态包含:将被包含的文件先引进来再一起编译。即先包含后编译
<%@ include=”路径”%>,可以包含html,jsp,txt,htm
动态包含: 先将被包含的文件编译后再引进来编译
<jsp:includepage=”{要包含的文件||<%=表达式%>}” flush=”ture|false”>, flush默认是true,每个jsp页面都有buffer,true表示当buffer满了就输出。为false表示这个网页被完全读进来以后再输出。
一般我们使用动态包含,因为如果是静态页面html时,原样读取和静态包含没区别,如果是jsp的话,那么会先编译jsp页面再读取去,而且如果出现重复的变量不会出现任务问题。
5.页面跳转
服务器跳转:
<jsp:forward/>标签用处不大,如果用的话是使用request.getRequestDispatcher("").forward(request, response);方法。
客户端跳转:
response.setHeader(“refresh”,”2:url”);//2秒后跳转到url页面,如果没有url则刷新当前页面
response.sendRedirect(“url”);
6. 4种属性范围:
page: javax.servlet.jsp.PageContext的实例,只在一个页面中保存属性,跳转之后无效,无论服务器还是客户端跳转。
request:javax.servlet.http.HttpServletRequest的实例,只在一次请求中保存,服务器跳转后依然有效。
session:javax.servlet.http.HttpSession的实例,在一次会话范围中,无论服务器还是客户端跳转都有效,但新开浏览器无效。
application:javax.servlet.ServletContext的实例,在整个服务器上都有效,保存所以用户的共享信息。
每个属性范围提供的方法,当然还有其它的方法:
setAttribute(Stringname,Object o)
getAttribute(Stringname)
removeAttribute(Stringname)
也可以使用page属性范围设置其它的属性范围值。比如
pageContext.setAttribute(Stringname,Object o,PageContext.REQUEST_SCOPE); 等同于request. setAttribute(String name,Object o);
pageContext(Stringname,Object o,PageContext.SESSION_SCOPE);等同于
session. . setAttribute(Stringname,Object o);
pageContext(Stringname,Object o,PageContext.APPLICATION_SCOPE);等同于
application. setAttribute(Stringname,Object o);
7.页面跳转取值
取单个值 ,比如前一个页面传的是单值:
<input type=”text”value=”陈哥”/>
取值方式:String name = request.getParameter(“name”);
取多个参数值,比如前一个页面传的是复选框
<input type=”checkbox”name=”**name” value=”吃苹果”/>
<input type=”checkbox”name=”**name” value=”吃梨子”/>
<input type=”checkbox”name=”**name” value=”吃西瓜”/>
取值方式:String name[] = request.getParameterValues(“**name”);
ps:凡是以“**”开关的都按照数组的形势接收
8.查看jsp页面缓冲区
out.getBufferSize();返回jsp中缓冲区的大小
out.getRemaing();返回jsp中未使用的缓冲大小
9.javaBean作用只是接收传入参数然后在JSP页面里使用,我觉得作用不大,完全可以用${}代码。
10.EL:expression Language 表达式语言 ${属性名},可以方便的访问标志位中的属性内容,分别有page(pageContext),request,session,application4种标志位。如果输出的内容是null,会自动转化成””空字符串。
el里的内置对象:
pageConcontext:javax.servlet.jsp.PageContext实例
pageScope:从page属性范围查找属性内容
requestScope:从request属性范围查找属性内容
sessionScope:从session属性范围查找属性内容
applicationScope:从application属性范围查找属性内容
param:接收传递到本jsp页面的参数,功能与request.getParameter()类似。
paramValues:接收传递到jsp页面的一组参数,比如${paramValues.参数名[0|1|2|...]}
header:取得一个头信息数据
headerValues:取出一组头信息数据
cookie:取出cookie中的数据
initParamm:取得配置的初始化参数
11.取出指定属性范围内的属性内容:
${pageScope.属性名}
${requestScope.属性名}
${sessionScope.属性名}
${applicationScope.属性名}
12.有用的核心标签库:
<c:out/>:输出内容,可以用${}代替,当然<c:out/>可以设置默认值。
语法:<c:outvalue=”” default=”默认值” escapeXml=”是否忽略xml标签’>’和’<’,默认是tue”/>
<c:if/>:单个条件判断,
语法:没有标签体,<c:iftest=”判断条件” var=”存储判断结果” [scope=”page|request|session|application”]/>
有标签体,<c:iftest=”判断条件” var=”存储判断结果” [scope=”page|request|session|application”]>
满足条件时执行的语句
</c:if>
<c:choose/><c:when/><c:otherwise/>:多条件判断
比如:<c:choose>
<c:whentest=”${name==”张三”}”>
<h2>我是张三</h2>
</c:when>
<c:when test=”${name==”李四}”>
<h2>我是李四</h2>
</c:when>
<c:otherwise>
<h2>他们都是假的,是我王五</h2>
</c:otherwise>
</c:choose>
<c:forEach>:遍历集合,如list,Array,set,Map
语法:<c:forEach[var=”每个对象属性名称”] items=”集合名” [varStatus=”保存相关成员信息,比如index” ] [begin=”集合开始位置”] [end=”集合结束位置”] [step=”每次增长的长度,默认是1”]>
执行的语句
</c:forEach>
其中list,set,array写法是一样的。比如有个list数据,写法如下:
<c:forEach var=”item” items=”list” varStatus=”status”>
<h2>${status.index},${item}</h2>
</c:forEach>
Map有点特殊,写法如下:
<c:forEach items=”map” var=”item”>
${map.key},${map.value}
</c:forEach>
<:c:forTokens>:对字符串的拆分,类似split()的功能。
语法:<c:forTokens[var=”存放每个字符串变量”] items=”字符串数据” delims=”字符串分割符” [varStatus=”存放当前对象的相关信息”] [begin=”开始位置”] [end=”结束位置” [step=”步长”]]>
执行的语句
</c:forTokens>
例如:
<%
String str=”I,love,you”;
%>
<c:forTokens items=”${str}” delims=”,”var=”com”>
${con}:
</c:forTokens>
输出结果是I:love:you
<c:url/><c:param/>构造url
语法:<c:urlvalue=”操作的url” [context=”上下文路径”] [var=”c:url的引用名,可借外部引用,用${var值}即可拿到该url”] [scope=”[page|request|session|application]”]>
<c:paramname=”参数名” value=”参数值”/>
</c:url>
我觉得就这几个核心标签库有用,其它都是鸡肋。