代码改变世界

第三周学习记录

2017-11-11 18:44  melay  阅读(193)  评论(0编辑  收藏  举报

这周主要学习第七章会话与状态管理和JSP的运行机制和语法部分。下面主要把自己比较模糊的概念梳理一下。

中文乱码问题

解决post提交的中文乱码

private void test1(HttpServletRequest request)
			throws UnsupportedEncodingException {
		
		request.setCharacterEncoding("UTF-8");
		
		String username=request.getParameter("username");	
		
		System.out.println(username);
		
	}

解决get提交、超链接以及URI提交的中文乱码(手工处理)

private void test2(HttpServletRequest request)
			throws UnsupportedEncodingException {
		
		String username=request.getParameter("username");
		
		username=new String(username.getBytes("iso8859-1"),"UTF-8");
		
		System.out.println(username);
	}

请求转发的细节

特点:

  • 客户端只发一次请求,服务器有多个资源调用
  • 客户端地址栏不变

如果在调用forward方法之前,在servlet程序中写入的部分内容已经被真正地传送到客户端,forward会抛出异常java.lang.IllegalStateException。

调用forward方法之前向Servlet引擎的缓冲区(response)写入内容,只要缓冲区的内容还没有真正输出到客户端,forward方法就有效,方法可以正常执行,原来写入缓冲区的内容被清空,response对象响应头字段信息保持有效

页面包含

Web工程中各类地址的写法

//1
		request.getRequestDispatcher("/index.jsp").forward(request, response);
		
		//2
		response.sendRedirect("/reqtest2/index.jsp");
		
		//3
		this.getServletContext().getRealPath("/index.jsp");
		
		//4
		this.getServletContext().getResourcePaths("/index.jsp");
		//5
		/*
		 * <a href="/reqtest2/index.jsp">点点</a>
		 * <form action="/reqtest2/index.jsp">
		 * </form>
		 * */

会话管理

会话:开浏览器访问多个WEB资源,关闭浏览器。

保存会话数据的两种技术:

  • Cookie(客户端技术)

    • 一个cookie只能标识一种信息,至少含有一个标识该信息的名称和设置值。

    • 一个Web站点可以给一个浏览器发送多个cookie,一个web浏览器也可以存储多个web站点提供的Cookie。

    • 浏览器一般只允许存放300个cookie,每个站点最多存放20个,每个cookie的大小限制为4kB

    • maxAge为0时,命令浏览器删除该cookie。

    • 删除cookie时,path必须一致,否则不会删除。

  • Session(服务器端技术)

    • 服务器为每个用户浏览器创建一个会话对象,一个浏览器独占一个session对象。
    • session对象由服务器创建,调用request对象的getSession方法可以得到session对象。
session对象生命周期:

创建:第一次执行getsession代码
销毁:30分钟没人用之后销毁

application域与session域属性的比较

存储在servletContext对象中的属性可以被所有的servlet程序访问和共享,而不管访问来自哪个客户端

存储在HttpSession对象中的属性也可以被所有的servlet程序访问,但仅仅是来自一个客户端的一组访问才能共享同一个HttpSession。

session超时管理

Web服务器采用“超时限制”的方式来胖端客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,Web服务器则认为该客户端已经停止了活动,结束会话,并将对应的HttpSession变为垃圾清除。如果超时后再次访问,创建新的Httpsession。分钟为单位,为0或者负数,表示永不超时。

<session-config>
    <session-timeout> 30</session-timeout>
</session-config>
什么情况下调用request.getSession(false)方法?

例如一些Web应用程序要求只有用户成功登陆后才能真正开启与客户端的会话过程。系统可以限定只有某个servlet程序可以调用request.getSession()方法来创建HttpSession对象,其他的程序只能调用request.getSession(false)方法来获得HttpSession对象。

利用Cookie实现session跟踪

Web服务器处理服务请求是创建新的HTTPSession对象,会把会话标识号以Cookie的形式回传给Web服务器。Web服务器端程序依据回传的会话标识号就知道已经为该客户端创建了HTTPsession对象,直接使用与该会话标识匹配的HTTPsession对象,通过这种方式实现对同一个客户端的会话状态的跟踪。

利用URL重写实现session跟踪

当用户单击响应消息的超链接来发出下一次请求时,如果请求消息中没有包含Cookie头字段,servlet引擎则认为客户端不支持Cookie,他将依据请求URL的参数中的会话标识号来实施会话跟踪。要求在响应消息中出现的指向当前应用程序中的资源的超链接地址后面都附带会话标识号参数,且用户必须通过超链接来提交后续的访问请求。

URL重写:将会话标识号以参数形式附加在超链接的URL地址后面的技术。

  • encodeURL方法:用于对超链接和form表单的action属性中设置的URL进行重写。
  • encodeRedirectURL方法:用于对要传递给HttpServletResponse.sendRedirect方法的URL进行重写。

三个容器request、session、servletContext

  • request:显示完了数据没用了
  • session:产生数据显示完之后还要用到数据
  • servletContext:产生数据显示完之后还要给别人用

pageContext对象的范围只适用于当前页面范围,即超过这个页面就不能够使用了。所以使用pageContext对象向其它页面传递参数是不可能的。
session的作用范围为一段用户持续和服务器所连接的时间,但与服务器断线后,这个属性就无效。比如断网或者关闭浏览器。
application的范围在服务器一开始执行服务,到服务器关闭为止。它的范围最大,生存周期最长。

getAttribute和getParameter的区别

getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型
getParameter表示接收参数,参数为页面提交的参数,包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter),而且接收参数返回的不是Object,而是String类型

JSP认识

1.JSP页面:由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件。分为脚本片段和模板元素。

  • 脚本元素(嵌套在<%和%>中的内容):Java代码被解释执行
  • 模板元素(没有嵌套在<%和%>中的内容):原封不动地输出给浏览器

JSP最佳实践

servlet作为web应用中控制器组件来使用,JSP技术作为数据显示模板来使用。因此,servlet只负责响应请求产生数据,并把数据通过转发技术带给JSP,数据的显示由JSP来做。

JSP语法

  • JSP脚本表达式
    当前时间值为:
    <%
    	
    	Date date= new Date();
    	String time =date.toLocaleString();
     %>
     <%=time%><!-- 脚本表达式,它的作用就是用于向浏览器输出数据 -->
    
  • JSP声明:jSP拥有自己的方法。
    <%!
        public void run(){
            
        }
    %>
    
  • JSP注释
    <%-- 注释--%>