一.JSP的运用
1).WHY
JSP是简Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用java代码来编写,而对固定不变的静态内容采用普通静态html页面的方式编写。
Java Server Page:java服务器网页,在html页面编写java代码
2).新建一个JSP页面,在body节点内的<% %> 即可编写java代码
<body> <% Date date=new Date(); System.out.println(date); %> </body>
3).可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径和普通html的访问路径形式也完全一样。
4).JSP的运行原理:JSP本质上是一个Servlet
每个JSP页面在第一次被访问时。JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEb容器(Servlet引擎)向调用普通Servlet程序一样的方式来装载和解释执行这个由jsp翻译成的Servlet程序。
5)JSP页面的隐含变量:
public void _jspService(HttpServletRequest request,HttpServletReponse reponse)throws java.io.IOException,ServletException{ PageContext pageContext=null; HttpSession session=null; ServletContext application=null; ServletConfig config=null; JspWriter out=null; object page=this;
//...
//使用<% %>编写的代码在此位置,可以用到request,reponse,pageContext,session
//application,config,out,page这8个隐含对象。(实际上还可以使用一个叫exception的隐含对象)
}
1.request:HttpServletRequest的一个对象.
2.reponse:HttpServletRepomse的一个对象(在JSP页面中几乎不会调用reponse的任何方法。)
3.pageContext:页面的上下文,是PageContext的一个对象。可以从该对象获取到其他8个隐含对象,也可以从中获取到当前页面的其他信息。(学习自定义标签时使用它)
4.session:代表浏览器和服务器的一次会话,是HttpSession的一个对象。
5.application:代表当前WEB应用,是ServletContext对象。
6.config:当前JSP对应的Servlet的ServletConfig对象(几乎不使用)。若需要访问当前Jsp配置的初始化参数,需要通过映射的地址才可以。
映射JSP:
<servlet> <servlet-name>hellojsp</servlet-name> <jsp-file>/hello.jsp</jsp-file> <init-param> <param-name>test</param-name> <param-value>testValue</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hellojsp</servlet-name> <url-pattern>/hellojsp<url-pattern> <servlet-mapping>
7.out:JspWriter对象,调用out.println() 可以直接把字符串打印到浏览器上。
8.page:指向当前JSP对应的Servlet对象的引用,开发的时候几乎不使用。
9.exception:在声明了page指令的isErrorPage="true"时,才可以使用
<%@ page isErrorPage="true" %>
pageContext,request,session,application(对属性的作用域的范围从小到大)
out,config,page,reponse
二.JSP基本语法
1).JSP模板元素:JSP页面中的静态HTML内容
2).JSP表达式(expression)提供了将一个JAVA变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%=和%>之中。
3).JSP脚本片段(Scriptlet)是指嵌套在<%和%>之间的一条或多条java程序代码
多个脚本片段中的代码可以相互访问
<% String ageStr=request.getParameter("age"); Integer age=Integer.parseInt(ageStr); if(age>=18){ out.println("成年.."); }else{ out.println("未成年..."); } %>
4).JSP声明:JSP声明将Java代码封装在<%和%>之中,它里面的代码将被插入进Servlet的_jspServlet方法的外面(在JSP页面中几乎不用)
5).JSP注释的格式
<%-- JSP注释--%> <!--HTML注释 -->
区别:JSP注释可以制止java代码的运行
和属性相关的方法:
1).
Object getAttribute(String name):获取指定的属性
Enumeration getAttributeNames():获取所有的属性的名字组成的Enumeration对象
removeSttribute(String name):移除指定的属性
void serAttribute(String name,Object o):设置属性
2).pageComtext,request,session,application对象都有这些方法
这四个对象也称为域对象。
pageContext:属性的作用范围仅限于当前JSP页面
request:属性的作用范围仅限于同一个请求。
session:属性的作用范围仅限一次会话,浏览器打开到关闭称之为一次会话(在此期间会话不失效。)
application:属性的作用范围限于当前WEB应用。是范围最大的属性作用范围,只用在一处设置属性,在其他各处的JSP或Servlet中都可以得到
6.请求的转发和重定向
请求的转发:
1.调用HttpServletRequest的getRequestDispatcher()方法获取RequestDispatcher对象
调用getRequestDispatcher()需要传入转发的地址
String path="testServlet";
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path);
2.调用httpServletRequest的forward(request,reponse)进行请求转发
RequestDispatcher.forward(request,reponse);
2).请求的重定向代码:
执行请求的重定向,直接调用reponse.sendRedirect(path)方法
//path为重定向的地址
String path="testSetvlet";
reponse.sendRedirect(path);
1).本质区别:请求的转发只发了一次请求,而重定向则发了两次请求
具体:
1.地址栏是初次请求的地址;
请求的重定向:地址栏不再是初次发出的地址,地址栏为最后响应的地址
2.请求转发:在最终的Servlet中,request对象和中转的那个request是同一个对象。
请求的重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象。
3.请求转发:只能转发给当前WEB应用的资源
请求的重定向:可以定向到任何资源.
4.请求转发:/代表当前WEB应用的根目录
请求的重定向:/代表WEB站点的根目录。
三.JSP指令
JSP指令:JSP指令是为JSP引擎设计的,他们并不直接产生任何可见输出,而是告诉引擎如何处理jsp页面中的其余部分。
常见的有page,include,taglib
Page指令:
page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面的什么地方,它 作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好放在整个jsp页面的起始部分.
2)page指令常用的属性:
1import属性:指定当前JSP页面对应的Servlet需要导入的类;
<%@page import="java.text.DateFormat"%>
2.session属性:取值为true或false,指定当前页面的session隐藏变量是否可用,也可以说访问当前页面是是否一定生成httpSession对象。
<%page session="false"%>
1.errosPage和isErrorPage:
>errorPage指定若当前页面出现错误的实际响应页面时。其中/表示的是当前WEB应用的根目录。
<% page errorPage="/error.jsp"%
>isErrorPage指定当前页面的错误处理页面,可以说明当前页面是否可以使用Exception隐藏变量,需要注意的是isErrorPage="true",并使用exception的方法了,一般不建议能够直接访问该页面
>如何使客户不能直接访问某一个页面呢? 杜宇Tomcat服务器而言,WEB-INF下的文件是不能通过在浏览器直接输入来访问的,但通过请求转发是可以的。
4.contentType:指定当前JSP页面的响应类型。实际调用的是reponse,setContentType="text/html; charset=UTF-8"
通常情况下,对于JSP页面而言其取值均为text/html;chaeset=UTF-8.charset指定返回的页面的字符编码是什么。通常是UTF-8
5.pageEncoding:指定当前JSP页面的字符编码,通常情况下该值和contextType中的charset一致。
3.include指令:
1).include指令用于通知JSP引擎在翻译当前JSP页面时将其他的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式 称为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet
2).file属性的设置值必须使用相对路径。如果以"/"开头,表示当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
4.jsp:include标签
1).<jsp:include page="b.jsp"></jsp:include>
2).动态引入:并不是像include指令一样生成一个Servlet院文明就挨骂,而是生成两个Servlet源文件,然后通过一个方法的方式把目标页面包含进来。
org.apache.jasper.runtime.JspRuntimeLibrary.include(request,reponse,"b.jsp",out,flase);
5.include指令和jsp:include标签:
1).<jsp:include>
jsp:forward:
1).<jsp:forward page="/include/b.jsp"></jsp:forward> <%request.getRequestDispatcher("/include/b.jsp").forward(request,response)%>
2).但使用jsp:forward可以使用jsp:param字标签向b.jsp传入一些参数,同样jsp:include也可以用jsp:param标签
<jsp:forward page="/include/b.jsp"></jsp:forward>
<jsp:param value="abcd" name="username"/>
or
<jsp:forward page="/include/b.jsp"></jsp:forward>
<jsp:param value="abcd" name="username"/>
</jsp:include>
在b.jsp页面可以通过request.getParameter("username")虎丘到传入的请求参数。
原文:https://www.cnblogs.com/yuyiWang/p/9404647.html