最近在看了一些java基础问题,顺便将这段时间看到的容易混淆和已忘记的问题进行整理总结一下.java
接下来会再写一些数据库方面易混淆或者不经常使用易忘记的问题梳理mysql
上一篇是java基础方面易混淆问题总结: https://my.oschina.net/u/2342969/blog/1631422sql
一、servlet中forward()与redirect()的区别数据库
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,因此它的地址栏中仍是原来的地址。更加高效,它能够知足须要时,尽可能使用forward()方法,这样也有助于隐藏实际的连接。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址,通常来说浏览器会用刚才请求的全部参数从新请求,可是在须要跳转到一个其它服务器上的资源,必须使用此方法数组
二、Request对象的主要方法浏览器
setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象全部属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的全部Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
getHeader(String name):得到HTTP协议定义的文件头信息
getHeaders(String name):返回指定名字的request Header的全部值,结果是一个枚举的实例
getHeaderNames():返回因此request Header的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于得到请求中的数据
getMethod():得到客户端向服务器端传送数据的方法
getParameter(String name):得到客户端传送给服务器端的有name指定的参数值
getParameterNames():得到客户端传送给服务器端的全部参数的名字,结果是一个枚举的实例
getParametervalues(String name):得到有name指定的参数的全部值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():得到查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性缓存
三、request.getAttribute()和 request.getParameter()有何区别?服务器
getParameter获得的都是String类型的。或者是http://a.jsp?id=123中的123,或者是某个表单提交过去的数据。
getAttribute则能够是对象。
getParameter()是获取POST/GET传递的参数值;
getAttribute()是获取对象容器中的数据值;
getParameter:用于客户端重定向时,即点击了连接或提交按扭时传值用,即用于在用表单或url重定向传值时接收数据用。
getAttribute:用于服务器端重定向时,即在sevlet中使用了forward函数,或struts中使用了mapping.findForward。getAttribute只能收到程序用setAttribute传过来的值。
getParameter()是获取POST/GET传递的参数值;
getAttribute()是获取SESSION的值;
另外,能够用setAttribute,getAttribute发送接收对象.而getParameter显然只能传字符串。setAttribute是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另外一个页面时,应用服务器会把这块内存拷贝另外一个页面所对应的内存中。这样getAttribute就能取得你所设下的值,固然这种方法能够传对象。session也同样,只是对象在内存中的生命周期不同而已。getParameter只是应用服务器在分析你送上来的request页面的文本时,取得你设在表单或url重定向时的值。
getParameter返回的是String, 用于读取提交的表单中的值;
getAttribute返回的是Object,需进行转换,可用setAttribute设置成任意对象,使用很灵活,可随时用;cookie
四、jsp有哪些内置对象?做用分别是什么?分别有什么方法?session
JSP共有如下9个内置的对象:
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页自己
exception 针对错误网页,未捕捉的例外
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,而且提供了几个用于获取cookie, header,和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各类范围的名字空间、servlet相关的对象的API,而且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session能够存贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
page表示从该页面产生的一个servlet实例
五、注册Jdbc驱动程序的三种方式
1) Class.forName("com.mysql.jdbc.Driver"); --> 推荐
2)DriverManager.registerDriver(new com.mysql.jdbc.Driver())
3) System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");
注释:
第二种与第三种注册的方法看起来更加的直接与好理解。第一种方法是经过Class把类先装载到java的虚拟机中,并无建立Driver类的实例。
第三种与第一种方法能够脱离jdbc的驱动进行编译,第二种方法不能够的,它必定要有jdbc的驱动才能够经过编译,这样对咱们的程序就有不少的很差之处,为程序换数据库会带来麻烦
第一种的好处在于可以在编译时不依赖于特定的JDBC Driver库,也就是减小了项目代码的依赖性,并且也很容易改形成从配置文件读取JDBC配置,从而能够在运行时动态更换数据库链接驱动。
六、用JDBC如何调用存储过程
前面注册驱动以及后面关闭资源等固定模式代码就不贴了,直接贴核心代码:
cstmt = cn.prepareCall("{callinsert_Student(?,?,?)}");
cstmt.registerOutParameter(3,Types.INTEGER);
cstmt.setString(1,"wangwu");
cstmt.setInt(2, 25);
cstmt.execute();
七、JDBC中的PreparedStatement相比Statement的好处
1) PreparedStatement能够写动态参数化的查询
用PreparedStatement你能够写带参数的sql查询语句,经过使用相同的sql语句和不一样的参数值来作查询比建立一个不一样的查询语句要好
2) PreparedStatement比 Statement 更快
使用 PreparedStatement 最重要的一点好处是它拥有更佳的性能优点,SQL语句会预编译在数据库系统中。执行计划一样会被缓存起来,它容许数据库作参数化查询。使用预处理语句比普通的查询更快,由于它作的工做更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)。为了减小数据库的负载,生产环境中的JDBC代码你应该老是使用PreparedStatement 。值得注意的一点是:为了得到性能上的优点,应该使用参数化sql查询而不是字符串追加的方式。
3) PreparedStatement能够防止SQL注入式攻击
八、数据链接池的工做机制是什么?
J2EE服务器启动时会创建必定数量的池链接,并一直维持很多于此数目的池链接。客户端程序须要链接时,池驱动程序会返回一个未使用的池链接并将其表记为忙。若是当前没有空闲链接,池驱动程序就新建必定数量的链接,新建链接的数量有配置参数决定。当使用的池链接调用完成后,池驱动程序将此链接表记为空闲,其余调用就可使用这个链接。 实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关链接,而是把它代理的Connection对象还回到链接池中。