一,页面跳转(forward,sendRedire)与包含(include)的理解
1,问题(getInputStream() has already been call for response 异常)
Servlet(认真查看文字内容)
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//可以执行
req.getRequestDispatcher("./test.jsp").forward(req, resp);
//不可以执行,包含在同一个页面,两个写入流对其写入
//req.getRequestDispatcher("./test.jsp").include(req, resp);
//可以执行
//resp.sendRedirect("./test.jsp");
PrintWriter pw=(PrintWriter)resp.getWriter();
pw.write("查看是否有响应到客户端的页面中...");//forward时将不会显示在页面上
System.out.println("始终都会执行");//不管怎么跳转都会往下执行
}
test.jsp
<%
response.getOutputStream().write(new byte[]{2,2});
response.reset();
%>
对以上的几种执行情况进行分析
1,forward的跳转---可以执行:当执行这个方法时,控制权将交给test.jsp,由test.jsp响应给客户端,该servlet的信息打印或头部信息设置将不会返回给客户端,客户端只得到一次响应。这样一来servlet与jsp形成两个分支,两个流分别对自己的页面进行写数据,不会抛异常。
2,include的跳转---不可以执行:这种执行方法,是将两个进行合并然后再执行响应给客户端,这时,response.getOutputStream()与pw.write()同时对页面写入抛异常 java.lang.IllegalException getOutputStream() has already been called for response.
3,sendRedirect的跳转---可以执行:执行这个方法时,这样执行与第一种不同的是,servlet与jsp都有对客户端进行响应,总共进行了两次响应
可查看以下文章:(tocmat源码子 froward与sendredirect的理解 )http://www.iteye.com/topic/557980
----------------------------------------------------------------------------------------------------------------------------------
二,查询数据库临时表问题
在用公司sql编辑器创建一个临时表时,然后查询一直查不出来,查了很多原因,原来是因为在使用PreparedStatement预编译查询是在数据库端形成存储过程的预编译,故所创建的临时表只对存储过程内部有效...
修正:改为Statement查询时即可.
三,jdbc查询时遇到的问题:
在使用Statement下的execute(sql)方法时,会出现多个结果集,如运行存储过程时,可能会有多个结果集
Connection conn = dataSource.getConnection();
Statement st = null;
try {
st = conn.createStatement();
if (maxRows != null && !"".equals(maxRows)) {
st.setMaxRows(Integer.parseInt(maxRows));
}
boolean moreResult=st.execute(sql);
boolean moreUpdate = st.getUpdateCount() !=-1;
while(moreResult||moreUpdate){
if(moreResult){
ResultSet rs = st.getResultSet();
if (rs != null) {
sb.append(outputResultSet( rs));
}
}else{
if (st.getUpdateCount() != -1) {
sb.append(outputUpdateCount(st.getUpdateCount()));
}
}
moreResult = st.getMoreResults();
moreUpdate = st.getUpdateCount()!= -1;
}
} finally {
conn.commit();
closeDB(rs, st, conn);
}
四,jdbc中RowSet接口的特殊应用.
在平时的应用中.,我们所操作的RowSet已经提供了许多的运用,可滚动,可更新 ,但是必须保持着数据库连接,数据库中提出了另外几种的rowSet设置,可以不保持连接等操作,可看javax.sql.rowset中的几个操作(CacelRowSet 无连接)
五,OpenSessionInViewFilter
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception; OpenSessionInView提供了一种简便的方法,较好地解决了lazy loading问题.
它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。
Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。
六,jsp session false
在默认情况下,在对一个JSP页面发出请求时,如果session还没有建立,JSP页面会自动为请求建立一个session对象,但是session是比较消耗资源的,如果没必要保持和使用session,就不应该创建session, 例如一些只是用来宣传产品的网站,往往没必要使用session来保存信息,可以使用jsp页面指令session=”false”(禁用)来避免JSP页面为每个请求都自动创建session.实例代码如下:
<%@ page session=”false”>
七,拼接url后,用httpclient进行发送命令时,错误
如:http://192.168.7.83:8080/bws/auth/homepage.jsp?url=http://192.168.4.129:4444/bws?username='root'
url=http://192.168.4.129:4444/bws?username='root'是一个整体,但是浏览器并不知道问号是属于哪个的http
所以url不能decode因为是参数,被编码后,协议问题会获取不到。但是他后面的值进行decode之后,就能保持整体性。
八,当下载时可以指定其下载后文件名称
response.setHeader("content-disposition",
"attachment;filename=\""
+ URLEncoder.encode(name, "utf-8")+ "\"");
九,当下载哪种类型文件时,告诉浏览器,以怎样的形式打开
public class MimeTypes {
private static MimetypesFileTypeMap mimetypes = new MimetypesFileTypeMap();
static {// ----add mime type
mimetypes.addMimeTypes("application/x-shockwave-flash swf SWF");
mimetypes.addMimeTypes("application/pdf pdf PDF");
}
public static String getContentTypeByFileName(String fileName) {
return mimetypes.getContentType(fileName);
}
}
------------------------
//根据文件名称获取到相应的contentType,如是“pdf”浏览器会自动打开
if (contentType != null) {
response.setContentType(contentType);
}
十,在java中以预编译的形式设式全文检索异常。contains('',?)
测试时用jtds时设置进去时抛出错误,用sqlserver自带的驱动包可以,,,,,所以遇到这类的设置还是用字符串拼接