JSP知识归纳总结

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"/>

原文地址:https://www.cnblogs.com/wrkjwl/p/9113844.html