web核心(2)jsp

1.什么是jsp

Jsp的本质是servlet,当用户向servlet发送请求的时候 servlet利用输出流动态的生成html页面,包含每一个静态的html和所有在html页面出现的内容

 

2.jsp的三大指令

1)page 指令:<%@page 属性名1=“属性值1”  属性名2=“属性值2”...%> 用于定义JSP页面的各种属性,作用于整个JSP页面

错误页面的另一种方式是在相应的xml文件中配置

<%@ page errorPage="/error.jsp" %> <%--错误页面跳转 是一种转发--%>

<%@page import="java.util.Date"%>  <%--导包--%>

<%--language="java"语言java  contentType="text/html; charset=utf-8"指定当前 JSP 页面的响应类型 相当于response.setContentType("text/html; charset=UTF-8")--%>

<%--contentType="text/html;备注:text/plain:纯文本;text/html 纯文本的html  application/x-msexcel execl表格  application/x-msword word文件--%>

<%@ page language="java" contentType="text/html; charset=utf-8"

    pageEncoding="utf-8" %> 

<%--session是否可用默认为可用--%>

<%@page session="true" %>

<%--指定当前 JSP 页面是否可以使用 EL 表达式. 通常取值为 false--%>

<%@page isELIgnored="true" %>

各属性的含义

Language:声明当前 jsp页面使用的脚本语言种类,因为页面是jsp,该属性的值通常是java,该属性的默认值也是java,所以通常无需设置

Extends:指定jsp页面编译所产的java类所继承的父类,或者所实现的接口

Import:导包,默认包会自动导入不需要显示导入,默认包有  java.lang.*   javax.servlet.*  javax.servlet.jsp.*    javax.servlet.http.*

Session:设定这个页面是否需要session

Buffer:指定缓冲区的大小  默认值为8kb,可以设置为none,或者自定义大小单位为kb

Autoflush:当输出缓冲区即将溢出时,是否需要强制的将缓冲区的内容输出,设置为true正常输出,设置为false,则会在buffer溢出时产生有个异常

Info:设置jsp程序的信息,可以通过servlet,getservketinfo()方法获取该值

Erropage:指定错误页面,当页面出现错误或者异常的时候,而该jsp没有对应的处理代码,那么就会自动的调用该属性所指定的jsp页面

Iserrorpage:设置该jsp页面是否为错误处理程序,如果该页面已是错误处理页面,那么无需指定errorpage属性

Contenttype:设置生成网页的文件格式和编码字符集  默认文件格式为text/html,默认的字符集为iso-8859-1

Pageencoding:指定生成页面的编码字符集 需要与Contenttype的charset一致

2)include指令 可以是jsp html 文本文件 一段java代码 一般包含不变的信息 且不能有同名方法和变量名

<%@include  属性名=“属性值”%><%--静态引入--%>

<%--静态引入,将引入合并到当前页面成一个jsp--%>

<%@ include file=path %>

3)taglib指令 引入jsp需要用到的标签库

<%@taglib  属性名=“属性值”%>:

 

3.jsp9大内置隐含对象

JSP的运行原理: JSP 本质上是一个 Servlet.

Jsp书写上:JSP文件是在HTML文件中添加了Java代码

jsp中的隐含变量:request, response, pageContext, session , application, config, out, page 这 8 个隐含对象. (实际上还可以使用一个叫 exception 的隐含对象)

request:相当于httpservletrequest

response:相当于httpservletresponse

pageContext:可以获得其余的隐含变量

session:相当于httpsession  在<%@ page  session=true %>的时候会新建  在<%@ page session="false" %>不能新建,且只允许传入的方式

application:相当于servletcontext

config:相当于servletconfig

out:相当于response.getwrite 输出至页面

page:作用于当前页面

exception:只有指定了exception的iserrorpage=true才能使用,但是ie不支持

 

4.jsp4大作用域

pageContext:作用于当前页面

request:作用于同一请求

session:作用于一次对话,在没有设置时长的前提下

application:作用于当前web

 

5.jsp 13大内置标签中的常用的内置标签

1)jsp:incluce 标签: 动态映入,两个jsp页面通过方法引入

<jsp:include page=path></jsp:include>

2)jsp:forward:转发

<jsp:forward page=path></jsp:forward>

相等于request.getRequestDispatcher("/include/b.jsp").forward(request, response);

3)javabean

1><jsp:useBean id="名称" class="包名点类名 " scope="作用范围"> </jsp:useBean> 获取一个名为名称的对象

scope作用范围:  page(当前页面)   request(同一请求) session(一次会话)  application(当前web)

相当于如下代码

Student student=(Student)request.getAttribute("student");

if(student1==null){

       student=(Student)Class.forName(包名点类名).newInstance();

       request.setAttribute("student", student);

}

2><jsp:setProperty property="属性名"  value="属性值"  name="相应usebean的id名"/>

设置属性值,javabean类需要遵循其自身规则

3><jsp:getProperty  property="属性名" name=" 相应usebean的id名"></jsp:getProperty>

获取属性值,javabean类需要遵循其自身规则

4><jsp:param>

<jsp:param name="parameterName" value="{parameterValue | <%= expression %>

设置传递的参数例如密码等

不能够单独的存在 用于传递信息 需要与jsp.include   jsp:forword    jsp:plugin结合使用,Jsp:plugin中很少使用  主要用于下载服务器端的javabean和applet到客户端执行

 

6.jsp<%--   --%>与<!--  -->的区别

<%--   --%>这页面源码中是不可见的  代码写在这个里面不会执行,在其中只能定义局部变量不能是成员变量,

<!--  -->在页面的源码中是可见的  写在这么里面会相应的执行

<%! 声明部分  %> 用于声明变量和方法,在外表看起来似乎不需要定义类就可以直接的定义方法,方法似乎可以脱离类独立存在,实际上,jsp声明将会转化成对应的servlet的成员变量或者成员方法,因此jsp声明依然符合java的语法,不能用abstract定义方法,否则会将jsp对应的servlet变为抽象类而无法实体化,可以定义为其他的类型

 

7.include的动态与静态加载

<%@ include file=path %>与<jsp:include page=path></jsp:include>的区别

<%@ include file=path %>: 静态引入,将引入合并到当前页面成一个jsp,

<jsp:include page=path></jsp:include>:动态映入,两个jsp页面通过方法引入

 

8.错误页面的引入方式

配置错误页面的方式

方式1:

<%@ page errorPage="/error.jsp" %>  发生错误时跳转

<%@ page isErrorPage="true"%>:是否可以用exception来捕获异常信息,不能用于ie

方式2

还可以在 web.xml 文件中配置错误页面:  这个是根据相应的错误代码编写的,在相应的httpservlet中不需要书写其余的东西,这样可以减少维护,优化代码,

       <error-page>

      <!-- 指定出错的代码: 404 没有指定的资源, 500 内部错误. -->

             <error-code>404</error-code>

             <!-- 指定响应页面的位置  至于是转发还是重定向,好像应该是转发,可以将错误页面放入web-inf中,假如能到那么就是转发,因为只能转发访问-->

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

 

9.el的11大隐含对象

pagescope对应el中 Page

requestscope对应el中Request

sessionscope对应el中的Session

applicationscope对应el中的Application

PageContext:表示jsp中的PageContext

Param:相当于request.Getparameter

paramValues:如同

cookie:相当于request.getcookies

initParam:相当于servletconfig.getInitparameter

header:如同request.getheader

headerValues: 如同request.getheaders

使用方式:

${sessionScope.user.sex}相当于User user = (User)session.getAttribute("user"); String sex = user.getSex( );

${sessionscope.username}  相当于object username=session.getattribute(“username”)

这里注意在属性名字有下滑线,点时等(非字母数字)需要用【】例如如下

${user["My_Name"] } , ${sessionScope["com.student"]}   

注意上述属性需要遵循javabean规则

 

10.el的表达式

1)在1.2版本之前一律是string ,1.2之后假如是纯数字会相应的转化成数字

2)el中的运算符

向上转型

3)el的关系运算符

都是数字,按数字比较, 有string转化为string比较 string按自然顺序比较

4)el中的逻辑运算符

||  && !

5)其他运算符

Empty 判断是否为空  例如${empty requestScope.list}   返回boolean

${ A ? B : C} 

6)el函数

6.1)需要导入的包

标准标签库:Jstl包和standard包 

6.2)需要使用

<%@taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions" %>  引入包

6.33)使用方法如下:

${fn:length(param.name)}:获取长度

基本和string的方法类似

7)自定义el函数

tld配置文件
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0">
<!--下面三行主要是描述信息不是很重要可以随便写-->
  <description>JSTL 1.1core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
<!--Prefix=“fn” 中的fn就是下面定义的内容-->
<short-name>fn</short-name>
<!--指定的uri  紧随prefix后面的-->
<uri>http://java.sun.com/jsp/jstl/function1</uri>
<function>
<!--描述信息随便写-->
<description>
   Tests if an input string contains the specified substring.
</description>
<!—函数使用的名称 就像${fn:length(param.name)}的length -->
<name>contains</name>
<!—支撑该函数的类 -->
<function-class>包名点类名 </function-class>
<!--string 返回的类型 concat静态方法,java.lang.String, java.lang.String参数类型(需要包名点类名) -->
<function-signature>java.lang.String concat (java.lang.String, java.lang.String)</function-signature>
</function>
</taglib>

支撑类

package day01;

public class demo{
      public static Boolean contains(String str1,String str2){   
            return str1+str2
        }
}

11.jstl

1)导包

1>需要导包:同el

2>核心标签库引入如下,其他类似

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

2)核心库常用标签

1><c:out>输出内容,就像是 <%= scripting-language %>

例如: <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />

【】表示可选,escapeXml表示是否实现符号转换,default表示当value为null时输出的默认值,value输出显示的值

2><c:set> 保存相应的属性

用法1:设置在相应的scope中默认为page,倘若scope为request那么相当于

<% requst.setattribute(“vername”,”value”)%>  具体写法如下

<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>

用法2:

Target需要为javabean(那么就类似jsp内置标签setproperty),或者map集合,按键值对保存

< c:set value="value" target="target" property="propertyName" />

其中var 和scope 这两个属性不能使用表达式来表示

3><c:remove> 移除属性

<c:remove var="varName" [scope="{ page|request|session|application }"] />

移除相应的属性,scope指定为request是类似于request.removeattribute(“name”)

4><c:catch> 捕获异常并且存储

<c:catch [var="varName"] >… 欲抓取错误的部分</c:catch>

将相应的信息捕获至var变量中,类似于set中的带主体的方式,但是多了捕获异常

5>流程

<c:if>

不带主体

<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>

Test:结果true/false var保存结果 scope作用范围 没有内容输出

带主体

<c:if test="testCondition" [var="varName"][scope="{page|request|session|application}"]>

具体内容</c:if>

当没有var时默认输出至页面相应的内容,有时则会保存,不会输出

<c:choose>

<c:choose>本体内容( <when> 和 <otherwise> )</c:choose>

其中when相当于elseif otherwise相当于switch中的default  用法如下

<c:choose>

<c:when test="${condition1}">condition1 为true</c:when>

<c:otherwise>condition1 和condition2 都为false</c:otherwise>

</c:choose>

6><c:forEach> 循环遍历

<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"]

[end="end"] [step="step"]>

var 用来存放现在指到的成员

items 被迭代的集合对象

varStatus 用来存放现在指到的相关成员信息

begin 开始的位置

end 结束的位置

step 每次迭代的间隔数

varStatus 不能同begin  end  和step  一起使用  旗下的属性有如下

index number 现在指到成员的索引

count number 总共指到成员的总数

first boolean 现在指到的成员是否为第一个成员

last boolean 现在指到的成员是否为最后一个成员

<c:forEach items="${requestScope.custMap}" var="cust1" varStatus="stus">

       ${stus.index}, ${stus.count}, ${stus.first}, ${stus.last}: ${cust1.value.id }: ${cust1.value.name }<br>

</c:forEach>

默认的是pagescope ,上面的${stus.index}实际上是${pagescope.stus.index}的简写

7><c:forTokens> 类似于StringTokenizer类

<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]

[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>

var 用来存放现在指到的成员

items 被迭代的字符串

delims 定义用来分割字符串的字符

varStatus 用来存放现在指到的相关成员信息

begin 开始的位置

end 结束的位置

8><c:import> 载入页面

<c:import url="url" [context="context"] [var="varName"]

[scope="{page|request|session|application}"] [charEncoding="charEncoding"]>

url 文件被包含的地址

context相同Container 下,其他web站台必须以“/”开头 一般不写直接都写在url中

var 储存被包含的文件的内容(以String类型存入)

scope var 变量的JSP 范围

charEncoding 被包含文件之内容的编码格式

varReader 储存被包含的文件的内容(以Reader类型存入)

9><c:url> 重写 禁用session后数据的导入

<c:url value="value" [context="context"] [var="varName"]

[scope="{page|request|session|application}"] />

value 执行的URL

context 相同容器下,其他web 必须以“/”开头  一般不写直接都写在value中

var 储存被包含文件的内容(以String 类型存入)

scope var 变量的JSP 范围 

<c:url value="http://www.javafan.net " ><c:param name="param" value="value"/>

</c:url>

相当于<%=response.encodeURL("test1.jsp")%>

10><c:redirect> 重定向

<c:redirect url="url" [context="context"] > <c:param> </c:redirect >

url:地址

context:相同容器下,其他web 必须以“/”开头  一般不写这个都写在url中

<c:param>:参数 jsp隐含标签

<c:redirect url="/test.jsp"/>

11>自定义jstl函数

1)非嵌套

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<!--下面三行主要是描述信息不是很重要可以随便写-->
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
<!--Prefix=“c” 中的fn就是下面定义的内容-->
<short-name>c</short-name>
<!--指定的uri  紧随prefix后面的-->
<uri>http://java.sun.com/jsp/jstl/core1</uri>
<tag>
  <!--标签的名字:在jsp页面上使用时的名称 例如foreach 调用的名字-->
  <name>hello</name>
  <!--标签的支撑的全类名 调用的类-->
  <tag-class>包名点类名</tag-class>
  <!-- 标签体的类型  共三种
  empty  标签体为空
  scriptless:代表了可以有标签体 ,可以是EL、JSTL等,但是不能有 java表达式
  tagdependent:jsp引擎对标签不做任何处理而且把最原始的标签体内容传递给
  标签处理器类  这个基本不用-->
  <body-content>empty</body-content>
  <!-- 描述当前标签的属性 -->
  <attribute>
  <!-- 属性名 -->
  <name>count</name>
  <!-- 该属性名是否必须 -->
  <required>true</required>
  <!--运行时是否可以动态的接受表达式的值-->
  <rtexprvalue>true</rtexprvalue>
  </attribute>
</tag>

支撑类需实现simpletag接口,通常继承的方式继承实现simpletag接口的simpletagsupport类(原由:simpletagsupport类只需要重写dotag方法就好了,其他的方法已被写好,简洁方便)

public class HelloSimpleTag1 extends SimpleTagSupport{
       private String count;  //count需要与相应的<name>一致
       public void setCount(String count) {
                this.count = count;    //需要遵循setter方式
       }
       @Override
       public void doTag() throws JspException, IOException {
                System.out.println(count);
       }
}

使用:

<c:hello  count="10"/>

2)嵌套

1>父子标签的定义

同上普通标签

2>支撑类

父类
public class ParentTag extends SimpleTagSupport{
       private String name="name";
       public String getName() {
               return name;
       }

       @Override
       public void doTag() throws JspException, IOException {
                getJspBody().invoke(null);       
       }
}

子类
public class SonTag extends SimpleTagSupport{
       @Override
       public void doTag() throws JspException, IOException {
                String name=((ParentTag)getParent()).getName();
                getJspContext().getOut().println(name);
       }
}

3>jsp中的使用

<c:parent>

<c:son></c:son>

</c:parent>

原文地址:https://www.cnblogs.com/gg128/p/9683676.html