web开发小知识
session共享机制:f5刷新是再次提交之前的数据请求 地址栏回车属于不同的请求 不同浏览器获取不到之前数据 同一浏览器可以获取同步数据 session注销:session.invalidate();//全部session失效 session.removeAttribute(xxx);//失效某个session cookie:不是内置对象 需要new 但服务端会仅仅自动new一个名字为jssionid的cookie getNmae()获取cookie对象的名字 getValue()获取cookie对象的值 request.getCookies()获取cookie对象数组 获取浏览器Jessionid:request.getCookies()[0].getValue() 和session.getId()值一样的 application.getContextPath() 当前项目的虚拟路径 application.getRealPath(application.getContextPath()) 当前项目的绝对路径 解决post请求乱码:request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); 四种范围对象:均有set、getAttribute的方法 pagecontext 当前页面有效 request 同一个请求有效 请求转发可共享数据,重定向(二次请求)数据拿不到 session 换浏览器、关闭浏览器无效 application 整个项目运行期间均有效包括换浏览器/关闭浏览器或其他项目访问也会无效 ····JNDI技术可实现关闭浏览器或其他项目访问也会有效···· JDBC:drivermanager-jdbd驱动 connection-连接 statement connection.createstatement() preparedstatement connection.preparestatement()) resultset 返回结果集 callablestatement 调用存储过程和函数 connection.preparecall(过程、函数名字) 过程无返回值用out代替 存储函数有返回值return 例子:xxx=connection.preparecall("{call 过程名(?,?,?)}") xxx.setInt(1,xx) xxx.setInt(2,xx) xxx.execute() xxx.registeroutparameter(3,Types.INTEGER)//设置返回值类型 int result=xxx.get(3) orecle大文本BLOB、CLOB(稍微大点的数据也可存储路径后io操作,缺点受路径影响)缺点笨重、 影响数据库内存 xxx.setBinarystream(2,inputstream);||先建inputstream后放入reader对象 xxx.setCharacterstream(2,reader); mysql是TEXT javabean定义:1、public修饰的类,public无参构造2、属性为private,并且提供get、set方法。 封装数据,提高代码复用率 servlet2.5使用需要在web.xml中配置路由 servlet3.0不需要配置,但在控制层的类前面加入注解@WebServlet("url地址") 2.5web.xml中通过load-on-startup设置数字来确定谁先执行初始化 3.0中在@WebServlet(load-on-startup=xx) url书写区别:<a href="a/add">请求会去src、webcontent中先找是否有a web.xml中的/ 代表项目根路径 jsp中的/ 代表域名+端口号部分 servlet生命周期: 加载(无需干预,自动)--初始化init方法(执行一次)--服务(service抽象方法)--销毁 destroy方法--卸载(无需干预,自动) web.xml中设置: 在整个web容器中设置的参数 <context-param> <param-name>xxx</param-name> <param-value>xxxx</param-value> </context-param> 参数获得方式:在servlet中用ServletContext servletContext=super.getServletContext(); String string=servletContext.getInitParameter("参数名字"); System.out.println(string); 在当前servlet中设置的参数方式: <servlet> <servlet-name>XXX</servlet-name> <servlet-class> XXXX </servlet-class> <init-param> <param-name>XXXXX</param-name> <param-value>XXXXXXX</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> 参数获得方式:在servlet中用string a=super.getInitParameter("参数名字"); 接口的空实现好处: 不用 实现类---接口 用类继承---空实现类---接口 可以把接口中不用的方法不实现 servlet中获取out、session、application的方法 Session session=(Session) request.getSession(); PrintWriter pWriter=response.getWriter(); application: ServletContext s=(ServletContext) request.getServletContext(); 获取请求数据存入数据库时,查看数据库存入的数据乱码问题:jdbc:mysql://localhost/article? useUnicode=true&characterEncoding=UTF-8 jsp---java----class文件:在Tomcat的work文件夹中 mysql实现分页: mysql从第0页开始,oracle、sqlserver从第1开始 从第0页开始 假设每页10个数据:select * from stu limit 0,10; 通用格式:select * from table limit (当前页-1)*pageSize,pageSize; oracle分页、:select * from stu where sno>=(n-1)*10+1 and sno<=n*10;前提是数据是id连续的 伪列不能大于等于 解决办法 查询结果嵌套 办法:使用伪列select s.* from stu s order by sno asc;先排序 然后:select rownum ,t* from(select s.* from stu s order by sno asc)t where rownum>=(n-1)*10+1 and rownum <=n*10; 最后:select * from( select rownum r,t* from(select s.* from stu s order by sno asc)t where rownum>=(n-1)*10+1 and rownum <=n*10;)t )where r>=(n-1)*10+1 and r<=n*10; 优化性能:select * from( select rownum r,t* from(select s.* from stu s order by sno asc)t where rownum <=n*10 )where r>=(n-1)*10+1 ; sqlserver2005+分页:rownum不能直接用,需要制定列为伪列:select * from( select row_num() over(sno order by sno asc) as r,* from stu where r<=n*10 )where r>=(n-1)*10+1 ; sqlserver2003分页:top关键字 select top 3 * from stu;查询第一页数据 假如每页3条 sqlserver2012+分页:offset fetch next only select * from stu order by sno offset (页数-1)*页面大小+1 rows fetch next 页面大小 rows only 分页实现:需要5个变量(数据总量 select count(*)from stu; 、每页条数页面大小 用户定义 、总页数、 程序自动计算sum%xx==0?sum/xx:sum/xx+1 当前页页码、 用户定义 当前页的对象集合) list的查询集合 获取所有表单数据的方法: var data = $("form").serialize(); return&return 在try中return,在finally执行前会把结果保存起来,即使在finally中有修改也以try中保存的值 为准,但如果是 引用类型,修改的属性会以finally修改后的为准; 3、如果try/finally 都有return,直接返回finally中的 return. +/concat +可以是字符串或者数字及其他基本类型数据,而concat只能接收字符串。 +左右可以为null, concat为会空指针。 如果拼接空字符串,concat会稍快,在速度上两者可以忽略不计,如果 拼接更多字符串建议用StringBuilder。 从 字节码来看+号编译后就是使用了 StringBuiler来拼接,所以一行+++的语句就会创建一个StringBuilder,多条+++ 语句就 会创建多个,所以为什么建议用StringBuilder的原因。 序列化 如果某个字段不想序列化,在该字段前加上transient关键字即可。 一个基于JSON的API的response应该包含以下header Content-Type:application/json; charset=utf-8 设置自动刷新 Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm"); 如何实现JSP或Servlet的单线程模式? 对于JSP页面,可以通过page指令进行设置。 <%@page isThreadSafe=”false”%> 对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。 说明:如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。