一、JSP概念
1.JSP与Servlet的区别与联系:
Servlet:包含HTML的Java代码。
JSP(Java ServerPages):包含Java代码的HTML,本质还是转换成为Servlet,但是能够解决Sevlet存在的缺点:输出HTML多时的困难。
注:JSP和Servlet都是产生动态内容的技术。
2.JSP处理流程:
<1>第一次请求或.jsp文件修改了:
.jsp文件—翻译—>_jsp.java文件(此类继承HttpJspBase类、实现JspSourceDependent接口)—编译—>_jsp.class文件——>实例化——>初始化_jspInit()方法——>服务_jspService(HttpServletRequest request, HttpServletResponseresponse)——>销毁_jspDestroy().
<2>非第一次请求:
.jsp文件——>实例化——>初始化_jspInit()方法——>服务——>销毁
注:除了第一次请求,以后的请求直接实例化,不需要翻译、编译,这也是为什么JSP第一次请求慢的原因。
3.JSP语法:
JSP里嵌套Java代码的规则:
<1>小脚本:
<%=表达式%> 翻译后:_jspService()中的out.print(表达式);
<2>表达式:
<%
语句1;
语句2;
……
%> 翻译后:_jspService()中的语句;
<3>变量、方法声明:
<%!
语句1;
语句2;
……
%> 翻译后:作为生成的Servlet的成员变量和成员方法;
<4>静态内容:文本、注释、标签等
翻译后:_jspService()中的out.write(“字符”).
4.page:提供容器信息
如:<%@ pagelanguage=”java” contenType=”text/html” char-set=”UTF-8” pageEncoding=”UTF-8”%>
导包:<%@ page import=”com.zh.numguess.Numguess” %>
5.Javabean:遵循一定设计模式的Java类,具体要求如下:
<1>要有一个无参的构造函数;
<2>属性私有,提供对应的getter和setter方法;
<3>要实现序列化接口:Serializable接口.
二、JSP动作:
1.<jsp:useBeanid="user"class="com.zh.ch01.User" scope="request"></jsp:useBean>
<!—- 作用:在指定的范围内查找指定的变量,如果变量存在,就用该变量;反之,实例化一个变量-->
<!-- id:指定要查找或创建的变量
class:要实例化的类
scope:指定要查找的范围(默认page范围)注意:session范围要加锁
type:要查找的赋给变量的类(不指定的话和class一致)
注:如果只只指定type而没有class,当变量找不到时就抛出异常。
-->
<1>直接赋值:赋值方式有三种(直接、小脚本、EL表达式)
如:<jsp:useBeanid="user"class="com.zh.ch01.User"scope="request"></jsp:useBean>
<!-- 以下代码可以放到useBean内部,也可以不在其内部 -->
<jsp:setPropertyproperty="name"name="user"value="l4"/><!-- 1.直接量赋值 -->
<jsp:getPropertyproperty="name"name="user"/>
<jsp:setPropertyproperty="name"name="user"value='<%="w8"%>'/><!-- 2.小脚本赋值 -->
<jsp:getPropertyproperty="name"name="user"/>
<jsp:setPropertyproperty="name"name="user"value='${"t6"}'/><!-- 3.EL表达式赋值 -->
<2>根据请求参数赋值:
<jsp:useBeanid="user"class="com.zh.ch01.User"scope="request"></jsp:useBean>
<!-- 以下代码可以放到useBean内部,也可以不在其内部 -->
<!-- param是用来指定获取的参数名称,在地址栏中原地址后写:?uname=”z3” -->
<jsp:setPropertyproperty="name"name="user"param="uname"/>
<jsp:getPropertyproperty="name"name="user"/>
2.<jsp:getProperty>
如:<jsp:useBeanid="user"class="com.zh.ch01.User"scope="request"></jsp:useBean>
<!-- 以下代码可以放到useBean内部,也可以不在其内部 -->
<jsp:setPropertyproperty="name"name="user"value="l4"/>
<%=user.getName() %><!-- 用以下方式代替 -->
<!-- property指定Bean的属性,name指定Bean的名称 -->
<jsp:getPropertyproperty="name"name="user"/>
3.<jsp:include>动态包含
注意动态包含与静态包含的区别:
静态包含:<%@include file=”…….html” %>静态包含不会检查所含文件的变化,适用于包含静态页面。
动态包含:<jsp:includepage=”…….jsp”></jsp:include>动态包含顾名思义,即总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
注:动态包含的每个页面都要写<jsp:useBean ……></jsp:useBean>,静态包含则不需要。
总的来说就是:一个包含动态页XXX.jsp,一个包含静态页XXX.htm
如:<jsp:includepage="Included.jsp">
<jsp:paramvalue="18"name="age"/> <!-传参 -à
</jsp:include>
Included.jsp页面内容:
<body>
included
<%=request.getParameter("age")%> <!-接受参数-à
</body>
4.<jsp:forward>:当前页面转发到下一页面
<jsp:forwardpage="To.jsp">
<jsp:paramvalue="24"name="age"/> <!—转发过程中传参-->
</jsp:forward>
To.jsp页面内容:
<body>
to
<%=request.getParameter("age")%> <!—接受参数—->
</body>
三、4个范围
Page:只能在当前的servlet访问到(静态包含也是page范围)
Request:在本次请求范围内访问(转发可以在多个servlet间访问、动态包含等)
Session:用户的本次会话
Application:应用不停止,变量都能访