jsp的9个隐含对象 request ,response ,pageContent,session,application,config,out,page.exception
request:HTTPServletRequest的一个对象、
response:HTTPServletResponse的一个对象、
pageContent:页面的上下文,是PageContent的一个对象,可以从该对象获取其他8个隐含对象
session:代表浏览器和服务器的一次会话,是HTTPSession的对象
application:代表web当前应用,是ServletContent的对象
config:当前jsp对应的Servlet的ServletConfig对象(几乎不使用)
out:JspWriter对象 调用out.println()直接把字符串打印在浏览器上;
page :指当前jsp对象的Servlet对象的引用
exception: 在声明了page指令的 isErrorPage=“true”才可以使用
Jsp运行原理:本质上是一个Servlet
每个jsp页面在第一次访问时,jsp引擎将他翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class文件 然后再由web容器(Servlet引擎)像调用普通Servlet程序一样的方式
来执行这个jsp页面翻译成的Servlet程序。
Jsp表达式
<%
Date date =new Date();
System.out.println(date);
%>
<% = date%>
Jsp声明: jsp声明将java代码封装在<%!和%>之中,他里面的代码将被插入进servler的_jspServlet方法的外面(在jsp页面中几乎不用)
二:
和属性相关的方法
方法
Object getAttribute(String name)获取指定属性
Enumeration(枚举) getAttributeNames()获取所有属性的名字组成的Enumeration对象
removeAttribute(String name) 删除指定属性
setAttribute(String name, Object o)设置属性
pageContent response session application都有这些方法!
这四个对象也成为域对象
pageContext.setAttribute("pageContextAttr", "pageContextValue");
request.setAttribute("requestAttr", "prequestValue");
session.setAttribute("sessionAttr", "sessionValue");
application.setAttribute("applicationAttr", "applicationValue");
<br><br>
pageContextAttr:<%=pageContext.getAttribute("pageContextAttr") %>
<br><br>
requestAttr:<%=request.getAttribute("requestAttr") %>
sessionAttr:<%= session.getAttribute("sessionAttr")%>
<br><br>
<%applicationAttr:<%=application.getAttribute("applicationAttr") %>
pageContext:属性的作用范围仅限于当前jsp页面
request:仅限于同一个请求(在转发的情况下可以跨页面获取属性值)
session:属性的作用范围限于一次会话:(浏览器打开直到关闭称成为一次会话)
application:属性的作用范围限于当前web应用 是范围最大的作用范围,只要在一处设置属性,在其他各处的JSP或Servlet
都可以获取得到
在Servlet中获取:
在Servlet中不能获取pageContext对象
//request
PrintWriter out=response.getWriter();
Object requestAttr=request.getAttribute("requestAttr");
out.print(requestAttr);
//session 通过getSession()获得session对象
Object sessionAttr=request.getSession().getAttribute("sessionAttr");
System.out.println(sessionAttr);
//application 因为application是ServletContext类 所以通过getServletContext()获得ServletContext对象
Object applicationAttr=getServletContext().getAttribute("applicationAttr");
System.out.println(applicationAttr);
转发和重定向
本质区别:请求的转发只发出了一次请求(地址栏不变),而重定向则发出了两个请求(地址栏变化,不再是初次请求的地址,是最后响应的那个地址)
转发: 在最终的Servlet中,request对象和中转的那个request是同一个对象
重定向: 在最终的Servlet中,request对象和中转的那个request不是同一个对象
转发:只能转发给当前WEB的资源
重定向:可以重定向到任何资源
转发:/代表的是当前WEB应用的根目录
重定向:/代表的是当前WEB站点的根目录
//转发(request) RequestDispatcher是一个接口
String path="testServlet";
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path); /表示根目录
requestDispatcher.forward(request, response);
//重定向(response)
String path="testServlet";
response.sendRedirect(path);
注意:WEB应用的根目录:http://localhost:8080/Ajax
WEB站点的根目录:http://localhost:8080/
Jsp指令; JSP指令时为了JSP引擎而设计的,他们并不产生任何输出,而只是告诉引擎如何处理JSP页面的其余部分 page include taglib
page指令:用于定义JSP页面的各种属性,无论Page出现在jsp页面的什么地方,他的作用都是整个jsp页面,但是为了编程习惯,最好放在其实位置
常用page指令
1. import属性:当前JSP页面对应的Servlet需要导入的类
<%@ page import="java.util.*" %>
2. session属性:取值为 false或true 指定当前页面的session隐藏变量是否可用,也可以说访问当前页面时是否生成HttpSession对象
<%@page session="false" %>
3. errorPage和isErrorPage
<%@ page errorPage="/error.jsp" %> 指令当前页面出现错误的页面是什么 /是当前web的根目录,响应error.jsp其实是一个转发的过程
<%@ page isErrorPage="true"%> 指令当前页面是否是错误处理页面,可以说明当前是否可以使用一个exception隐藏变量,
如何使客户不能直接访问某一个页面呢?
对于Tomcat服务器而言,WEB-INF下的文件不能通过浏览器在浏览器中直接输入地址的方式来访问的,因为那里一般都是放的隐私文件,
但通过请求的转发是可以的<%@ page errorPage="/WEB-INF/error.jsp" %>(响应error.jsp其这里是一个转发过程),
还可以在web.xml文件中配置错误页面:
<error-page>
<error-code>404</error-code> 指定错误的代码,404没有指定的资源,500内部错误
<location>/WEB-INF/error.jsp</location> 响应页面的位置
</error-page>
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/WEB-INF/error.jsp</location>
</error-page>
4.contentType:指定当前页面的响应类型,实际调用的是response.setContentType("text/html;charset=UTF-8")
对于jsp页面,一般是text/html;charset=UTF-8,charset返回页面的编码
5.pageEncoding:指定当前JSP页面的编码
6.isELIgnored:指定当前jsp页面是否可以使用EL表达式 通常取值为true
include指令:合并一个页面,转为servlet源文件中,这种在源文件的级别进行引入的方式是静态引入,当前jsp页面与静态引入的页面紧密结合为一个servlet
<%@ include file="b.jsp" %> file属性指定引入文件的相对路径,如果以/开头,表示相当于当前web应用的根目录,否则,表示相对于当前文件
jsp:include标签:
1. <jsp:include page="b.jsp"></jsp:include>
2.动态引入:并不是像lnclude指令生成一个Servlet源文件,而是生成两个Servlet两个源文件。通过一个方法的方式吧目标页面包含进来
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "b.jsp", out, false);
include指令和 jsp:include标签:
jsp:include标签是当前JSP页面的执行期间插入被引入资源的输出内容
jsp:forward标签:相当于转发
<jsp:forward page="b.jsp"></jsp:forward>
相当于 <%
request.getRequestDispatcher("b.jsp").forward(request, response);
%>
2.在使用jsp:forward可以使用jsp:param子标签向b.jsp传入一些参数 同样 jsp:include标签也可以使用jsp:param子标签
<jsp:forward page="b.jsp">
<jsp:param value="abc" name="username"/>
</jsp:forward>
<jsp:include page="b.jsp">
<jsp:param value="abc" name="username"/>
</jsp:include>
b.jsp中获取:
<%=request.getParameter("username") %>
关于中文乱码问题:
1,保住 contentType="text/html; charset=UTF-8" conpageEncoding="UTF-8",charset和conpageEncoding一致,
且都支持中文,还需要保证浏览器编码和JSP页面的编码相同
2,获取中文参数值:例如表单里的username的值
对于post请求:在获取请求信息之前调用一个方法<%request.setCharacterEncoding("utf-8"); %>
对于get请求: 1. String val=request.getParameter("username");
String username=new String(val.getBytes("iso-8859-1"),"UTF-8");
out.print(username); 先解码,在编码
2.也可以通过修改Tomcat的servlet.xml文件的方式 为Connector 结点添加useBodyEncodingForURI="true"即可
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true"/>