JSP学了很久了,把以前的零散的学习笔记搬到BLOG上来
1、关闭数据库连接
使用数据库连接时,记住要在finally中关闭,如果用到了连接池的话,实际上关闭操作实际上把连接归还给连接池;
2、从1开始
在使用ResultSet读取列值时,列是从左到右编号,第一列是1;比如"select id,name from student",可以使用rs.getString(2),也可以使用rs.getString("name")读取,但是前一种速度快些,后面一种可维护性强些,并且第二种方法中使用列名作为参数的时候,列名是不区分大小写的,所以也可是使用rs.getString("Name")读取;另外在用PreparedStatement的设置参数的时候,也是从1开始的;
3、安全的提供文件下载
在提供文件下载的时候,要防止盗连.内容被盗的损失不计,还加重了自己服务器的负担,而且还防止有人循环下载某一区间段的所有附件.解决问题的方法常见的有通过Apache Http Server来配置,只有满足一定条件的HTTP请求才允许下载;另一种是服务器生成一个随即的值,并放在Session对象中,当用户下载的文件的时候,必须把该随即值传回到服务器端,服务器断再判断该随即值是否和Session中的随即值一致;
4、forword与sendRedirect的区别
forword:RequestDispatcher dispatcher=request.getRequestDispatcher("/test.jsp");
dispatcher.forword(request,response);
sendRedirect:response.sendRedirect("/test.jsp");
如果称forword是一个导水渠,那么redirect则是一个指路人.forword将上一个流程的数据转向下一个流程,而redirect只是提示浏览器需要访问的下一个页面.因此forword只可以在同一个context中使用;
5、Action与DispatchAction
如果很多操作都是触发同一个已定义的Action,只是所带的method参数不同,这样设计方便把功能类似的操作定义在同一个Action里面,然后根据不同的method参数调用不同的方法.在定义Action的时候继承DispatchAction;而且在应用服务器中,每个Servlet就是一个线程,后一种办法会导致系统中存在大量的处理用户请求的线程,线程之间的切换的开销回严重降低应用服务器的性能;
6、sesson的关闭
一般情况下session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空.但是并不是浏览器关闭的时候session就消失了,这是不正确的.一般说来,session在下列情况下会被删除:
1)程序调用HttpSession.invalidate();
2)距离上一次收到客户端发送的session id时间间隔超过了session的超时限制;
3)服务器进程被停止或者重启;
7、java函数值传递还是引用传递?
java数据类型有两类:元数据类型和引用数据类型.在使用元数据类型进行传递的时候传递的是元数据类型本身的值,在传递引用数据类型的时候,传递的是这个引用对象的地址;
8、使用Filter控制权限
建立Filter文件(放在包myPackage下): public class MyFilter implements Filter { protected FilterConfig filterConfig;
public void init(FilterConfig config) throws ServletException { System.out.print("init"); this.filterConfig = config; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException{ HttpSession session=((HttpServletRequest)request).getSession(false); if(session==null||session.getAttribute("isLogon")==null){ ((HttpServletResponse)response).sendRedirect(((HttpServletRequest)request).getContextPath()+"/logon.jsp"); }else{ chain.doFilter(request,response); } }
public void destroy() { System.out.print("destroy"); this.filterConfig=null; } }
<filter> <filter-name>myFilter</filter-name> <filter-class>myPackage.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/myfile/*</url-pattern> </filter-mapping> 注:对于JSF,每个JSF生命周期它都要filter一次;而且不能根据Session为空来 判断是否已经登录,因为JSF就是用Session来实现交互的。 9、防止JSP页面回退 10、 |