J2EE基础---知识积累

一,页面跳转(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自带的驱动包可以,,,,,所以遇到这类的设置还是用字符串拼接

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值