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实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。

















	

  

posted @ 2019-07-03 10:45  黑魔法os  阅读(188)  评论(0编辑  收藏  举报