Java 内置对象
Java 作用域
解析:jsp内置对象是web容器创建的一组对象。我们都知道tomcat这款软件可以看成是一种web容器,所以我们可以知道所谓的内置对象都是由tomcat创建的。使用内置对象无需使用new关键字,直接使用即可。也就意味着只要你敢启动tomcat,在内存中已经驻留了N多内置对象。
01.什么是内置对象?
解析:就是web容器创建一组对象,这组对象在tomcat服务器启动的时候加载到内存,可以被用户直接使用。
do.jsp页面
welcome.jsp页面
北京欢迎您!<%=request.getAttribute("name")%>
1.为什么使用session
当一个请求发送到Web服务器时,无论其是否是第一次来访,服务器都会把它当做第一次来对待。在实际开发中,往往希望服务器能够识别已访问过的用户。session对象可以做到,因此我们要使用session。
2.什么是会话
就Web开发来说,一个会话就是用户通过浏览器与服务器之间进行的一次通话,它可以包含浏览器与服务器之间的多次请求、响应过程。简单地说就是在一段时间内,一个用户与Web服务器的一连串相关的交互过程。
在一个会话中,用户可能多次请求访问一个网页,也有可能请求访问同一个服务器的其他资源。当用户向服务器发出第一次请求时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束。注意:浏览器关闭可以导致会话结束!
session.setAttribute("username","张三");
设置session的失效时间
session.setMaxInactiveInterval(60*30);
获取sessionId:
<%=session.getId()%>
4.使用session对象实现权限控制
解析:所谓的权限控制,就是防止用户直接在地址栏中输入主界面地址,跳过登陆而操作业务数据。
5.Session对象的失效
session.removeAttribute()适用于清空指定的属性
session.invalidate()是清除当前session的所有相关信息
如果想从一个页面重定向到另一个目标页面,这个时候使用的是response.sendRedirect(“目标地址”);
如果想从一个页面重定向到另一个目标页面,这个时候使用的是转发操作,
request.getRequestDispatcher("main.jsp").forward(request,response);
重定向和转发:
01.从客户端发送的请求数量来看,重定向是向服务器发送了两次请求。而转发是服务器内部进的操作,只发送了一次请求,request对象中的数据可以保留 。
02.从URL显示的角度来说:重定向这两次请求都是直接受浏览器干预的。也就是说重定向后url地址栏里看到的地址发生变化了。而转发是由服务器内部从一个资源页面定位到另一个资源页面,并没有经过浏览器干预,所以url地址栏没有发生改变。
结论:要想在request中保存数据,那么就使用转发,否则使用重定向。
重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL,而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。
怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择重定向。
转发和重定向的区别
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
重定向过程:
客户浏览器发送http请求----》
web服务器接受后发送302响应要求客户浏览器发送一个新的http请求----》
客户端浏览器接受此响应后再发送一个新的http请求到服务器----》
服务器根据此请求寻找资源并发送给客户,
它可以重定向到任意URL,
不能共享request范围内的数据。
转发过程:
客户浏览器发送http请求----》
web服务器接受此请求后调用内部的一个方法在容器内部完成请求处理和转发动作----》
将目标资源发送给客户,它只能在同一个web应用中使用,可以共享request范围内的数据。
解析:网站中可能多处需要对用户的登陆身份进行校验,例如添加数据和修改数据都需要用户登陆后进行操作。那么可以将判定用户是否已经通过验证的代码提取到一个单独的页面中,在其他的页面中可以引入该页面代码进行判定。
在jsp中有两种包含,静态包含<%@include file="xxx.jsp"%>和动态包含
1、<%@include file="xxx.jsp"%>为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而
2、使用静态包含只会产生一个class文件,而使用动态包含会产生多个class文件
3、使用静态包含,包含页面和被包含页面的request对象为同一对象,因为静态包含只是将被包含的页面的内容复制到包含的页面中去;而动态包含包含页面和被包含页面不是同一个页面
通过form表单给服务器提交数据的时候,如果提交的是中文数据,那么可能会出现乱码,如果表单的请求方式是post请求,那么可以使用如下方案解决乱码:
在调用getParameter()之前,设置请求对象request的编码方式。
<% request.setCharacterEncoding("utf-8");%>
002.如果是通过get方式提交的form,两种处理乱码方案:
01.通过new String(str.getBytes(“iso-8859-1”),”utf-8”);
这种方式的缺点,每获取到一个用户提交的数据就要进行一道转换
02.通过conf下的server.xml文档的
connectionTimeout="20000"
redirectPort="8443"URIEcoding=”utf-8” />
不推荐使用第二种方式,但是要了解,因为真正的开发中,我们接触不到服务器。
404:服务器上找不到请求资源页面
500:服务器内部错误
200 OK 服务器成功处理了请求(这个是我们见到最多的)
|
|||||||||||||||||||||||
304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存 |
|||||||||||||||||||||||
404 Not Found 未找到资源 |
|||||||||||||||||||||||
501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服务 |
|||||||||||||||||||||||
很有用的
|
01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量。只要服务启动,则application对象就会存在。
02.在一个应用中只有一个application,每一个用户都会共享这一个application对象。
03.通过统计网站访问次数来讲解application的用法
代码如下:<%
Integer count=(Integer)application.getAttribute("count");
if(count!=null){
count=count+1;
}else{
count=1;
}
application.setAbbribute("count",count);
%>
您是第<%=count%>位访问者
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP '1.jsp' starting page
<%
pageContext.setAttribute("page", "我最小");
request.setAttribute("request", "我是3");
session.setAttribute("session", "我是2");
application.setAttribute("application", "我最大");
request.getRequestDispatcher("/myarea/2.jsp");
%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%=pageContext.getAttribute("page") %>
<%=request.getAttribute("request") %>
<%=session.getAttribute("session") %>
<%=application.getAttribute("application") %>
<%
response.sendRedirect(path+"/myarea/3.jsp");
%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP '3.jsp' starting page
<%=pageContext.getAttribute("page") %>
<%=request.getAttribute("request") %>
<%=session.getAttribute("session") %>
<%=application.getAttribute("application") %>
解析:cookie是Web服务器保存在客户端的一系列文本信息,根据域名和端口号区分是否保存成一个文件,文件大小为4k。注意:http://localhost:8080/news和http://localhost:8080/news/util会形成两个cookie文件。
获取指定key值cookie的核心代码
<%
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(int i=0;i
//引入JavaBean
<%@ page="org.jbit.news.bean.*" %>
//使用JavaBean
<%
User user=new User();
user.setUname("luky");
user.getPwd();
%>