收集平时碰到的一些小问题的解决方法。
java.lang.ClassCastException: oracle.sql.BLOB
tommcat目录下的lib文件夹中与项目中WEB-INF/lib下有同样的包导致,去掉其中一个即可。
java.sql.SQLException: 对只转发结果集的无效操作
stat = conn.createStatement();
改为 stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
就可以了
分析: 异常出现于移动结果集的指针时,原因是在生成statement对象的时候提供的参数不同
无参数的那个方法使用的是默认参数,statement
执行后得到的结果集类型为 ResultSet.TYPE_FORWARD_ONLY
.这种类型的结果集只能通过rs.next();
方法逐条读取,使用其他方法就会报异常. 如果想执行一些复杂的移动结果集指针的操作就要使用其他参数了
顺便简单介绍一下各个参数:
ResultSet.TYPE_FORWARD_ONLY
(略)ResultSet.TYPE_SCROLL_INSENSITIVE
双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。ResultSet.TYPE_SCROLL_SENSITIVE
双向滚动,并及时跟踪数据库里的更新,以便更改ResultSet中的数据。ResultSet.CONCUR_READ_ONLY
只读取ResultSetResultSet.CONCUR_UPDATABLE
用ResultSet更新数据库
bean user not found within scope
如果是1
<jsp:useBean id="person" type="bean.Bean_person" scope="request"/>
把他改成1
<jsp:useBean id="person" class="bean.Bean_person" scope="request"/>
PrintWriter 中文乱码
指定字符集为UTF-8
即可1
2response.setCharacterEncoding("UTF-8");
response.getWriter().write("");
配置filter拦截路径
Servlet JSR(2.3) 11.2章在web应用描述文件中,匹配的定义如下:
以’/‘开始,以’/ ‘为结尾的字符串,用作路径匹配
以’.’开始的字符串,用作扩展名匹配
包含’/‘字符串,定义一个默认的servlet。如匹配的servlet路径是请求URI路径的最小上下文路径,路经的info为空。
其它的字符串用作精确的匹配。
如果要拦截”/page/ .jsp”,应该配置”/page/ “,然后再到filter中判断后缀是否为”jsp”
“<%@ include file="" %>
,<jsp:include page="">
与 <c:import url="" />
的应用及区别”
<%@ include file="" %>
,<jsp:include page="">
与<c:import url="" />
的应用及区别
<%@ include file="" %>
伪指令在某些网站上有其用武之地。例如,如果站点包含一些(如果有变化,也很少)几乎没有变化的页眉、页脚和导航文件,那么基本的 include 伪指令是这些组件的最佳选项。由于 include 伪指令采用了高速缓存,因此只需放入包含文件一次,其内容就会被高速缓存,其结果会是极大地提高了站点的性能。<jsp:include page="">
flush 指示在读入包含内容之前是否清空任何现有的缓冲区。JSP 1.1 中需要 flush 属性,因此,如果代码中不用它,会得到一个错误。但是,在 JSP 1.2 中, flush 属性缺省为 false
设置flush为true,就是说,如果你的缓冲区的内容很多了,就将数据读出,以免数据泄漏,造成错误。服务器端页面缓冲,大致的意思是,在将生成的HTML代码送到客户端前,先在服务器端内存中保留,因为解释JSP或Servlet变成HTML是一步步进行的,可以在服务器端生成完HTML或生成一部分HTML(所占用字节数已达到指定的缓冲字节数)后再送到客户。如果不缓冲,就会解释生成一句HTML就向客户端送一句。
你还可以用jsp:param传递一个或多个参数给JSP 网页。1
2
3
4<jsp:include page="header.jsp" flush="true">
<jsp:param name="pageTitle" value="newInstance.com"/>
<jsp:param name="pageSlogan" value=" " />
</jsp:include><c:import url="" />
<c:import>
标签的功能类似于<jsp:include >
,但是相比来说还是<c:import>
标签的功能更强大一些。<jsp:include >
标签只能导入同一个web容器内的资源,而<c:import>
除此之外也可以导入外网的资源。同时<c:import>
也可以把页面内容插入到页面中,还可以把内容保存到String对象中。例如:1
2<c:import url="http://www.baidu.com" var="urlStr" />
<c:out value="${urlStr}" />
对request.getSession
理解
关于request.getSession(true/false/null)的区别
对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
getSession(boolean create)
意思是返回当前reqeust中的HttpSession ,如果当前reqeust中的HttpSession 为null,当create为true,就创建一个新的Session,否则返回null;
简而言之:
HttpServletRequest.getSession(ture)
等同于 HttpServletRequest.getSession();HttpServletRequest.getSession(false)
等同于如果当前Session没有就为null;
当向Session中存取登录信息时,一般建议:HttpSession session =request.getSession()
;
当从Session中获取登录信息时,一般建议:HttpSession session =request.getSession(false)
;
jstl的相关标签
迭代标签
jstl中的<c:forEach>
标签用于迭代需要的数组。
使用jstl标签都需要在页面中引用jstl标签库
1 | <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
<c:forEach>
的语法定义如下:
1 | <c:forEach var="item" items="${list}" varStatus="i" begin="1" end="10" step="1"> |
标签有如下属性:
- var: 需要迭代的参数名称
- items: 需迭代的集合
- varStatus: 迭代变量的名称,可以通过它来访问自身的信息
- begin: 迭代开始的位置
- end: 迭代结束的位置
- step: 迭代的步长。
varStatus
包含了一系列的特性,它们描述了当前的迭代状态,主要有
- current: 迭代至当前集合众的项
- index: 当前的迭代索引
- count: 集合的长度
- first: 判断是否为集合第一个元素,返回类型为boolean
- last: 判断是否为集合最后一个元素,返回类型为boolean
- begin: 获取迭代开始的位置
- end: 获取迭代结束的位置
- step: 获取迭代步长
判断标签
JSTL 的 if else : 有 c:if 没有 else 的处理
用jstl的if或when标签判断字符串是否为空
JSTL: empty 可以减少很多繁冗的判空
在jstl中判断可以使用<c:if test=""></c:if>
标签来进行判断,但是却没有<c:else>
这样的分支,如果要达到这种要求,可以使用<c:choose>
标签
1 | <c:choose> |
在以上代码中,当<c:when>
分支的条件都不符合时,则会进入<c:otherwise>
分支。
当判断字符串是否为空时,除了可以使用<c:if test="${str != ''}">
之外,还可以使用empty
关键字来判断,如<c:if test="${! empty str}">
.不仅仅如此,empty
还可以用来判断集合是否为空等。
使用fmt标签显示小数
需要另外引入标签库
1 | <%@tagliburi="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%> |
<fmt:formatNumber>
标签可以用来格式化需要的数字,例如如果需要输出的数字为两位小数,则可以使用它
1 | <c:set var="balance" value="112.345" /> |
maxFractionDigits
属性表示小数点后最大的位数,关于formatNumber
的其他参数可以参考这里.
fn函数
首先引入函数
1 | <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> |
fn
主要有如下函数
方法 | 说明 |
---|---|
fn:contains(string, substring) | 判断string是否包含substring |
fn:containsIgnoreCase(string, substring) | 判断string是否包含substring(不计大小写) |
fn:endsWith(string, suffix) | 判断string是否以suffix结尾 |
fn:escapeXml(string) | 跳过可以作为XML标记的字符 |
fn:indexOf(string, substring) | 返回substring第一次在string出现的位置 |
fn:join(array, separator) | 形成一个字符串以array+separator组成 |
fn:length(item) | 返回item的长度 String/Collection等 |
fn:replace(string, before, after) | 在string中用after替换掉before字符串 |
fn:split(string, separator) | 将string通过separator分割成数组 |
fn:substring(string, begin, end) | 通过开始位置begin与结束位置end从string截取子字符串 |
fn:substringAfter(string, substring) | 返回字符串在指定子串之后的子集 |
fn:substringBefore(string, substring) | 返回字符串在指定子串之前的子集 |
fn:toLowerCase(string) | 转换为小写 |
fn:toUpperCase(string) | 转换为大写 |
fn:trim(string) | 去除首位空格 |
具体示例可以查看JSTL函数