一篇文章带你读懂JSP的使用的理解

JSP语言是干嘛的呢?一句话:就是在html中编写java代码。能够直接在页面中运行并编译,能够访问已经存在的类接口等,在jsp中的java与你在后台写的java功能一样。相比servlet中,我们响应请求时,需要把大量的html写在方法里,很繁琐。jsp就能够在html中写java。但是两者貌似都有各自的弊端,servlet代码和页面写在方法中,jsp中代码和页面写在html中。尽管它的弊端很多,但是作为基础语言,还是很有必要了解和掌握的,下面鄙人就对自己的学习理解给大家介绍使用和理解。

一:JSP的执行过程和基本指向组成。

1. 在html中编写java代码,那这些java代码是怎么执行的呢?谁去执行呢?其实编写在页面中的java代码还是JVM去编译执行。

首先,在运行该JSP页面时,服务器会把world.jsp转译为world_jsp.java文件,他就形成了一个servlet,然后生成classes文件,再交给服务器去执行该classes文件,服务器将执行完成后的结果响应给浏览器,并形成页面信息生成html,在浏览器中显示出来。这就是JSP执行的过程,图解如下:

 二: 基本内容和写法:

<%@page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
 
你好 JSP
 
<br>
 
<%=new Date().toLocaleString()%>

1. <%   这里面是用来写JAVA代码的    %>

2. <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>

<%@%>这种表达方式的意思是指令的意思

这是页面内容的解释,contentType就相当于我们在servlet中的response.setContentType("text/html;charset=UTF-8"),就是告诉浏览器返回来的数据用什么内容显示以及编码方式是怎样的,pageEncoding意思就是本页面中的编码方式是怎样的。import这里代表我们编写java时需要用到的包的引用。

3. 显示内容的写法,也就相当于java中的print<%=%>,比如我们在jsp中的java代码中定义了int a = 1+1;则在页面中显示就可以<%=a%>,页面中显示2,例如我们在JSP页面中写一段for循环并且输出。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%
    List<String> words = new ArrayList<String>();
    words.add("today");
    words.add("is");
    words.add("a");
    words.add("great");
    words.add("day");
%>
  
<table width="200px" align="center" border="1" cellspacing="0">
  
<%for (String word : words) {%>   //用<%%>包含住java代码
 
<tr>
    <td><%=word%></td>      //循环体重循环行和列中list的内容
</tr>
 
<%}%>     //包含住java代码
  
</table>

此时页面中就会以表格的形式把list集合的数值输出到页面上。

4. include包含的使用:

页面中包含另一个页面的信息,通常包含一些网站的公共部分,比如网页头,底部的版本信息等,此时就需要用包含不然每个页面都写一次真的是费力劳神。我们准备一个公共的页面:public.jsp (该jsp中输出一句话即可)。那么include怎么使用呢?include有两种使用方式,

第一种:指令include:<%@include file="public.jsp" %>,将这句话写在你的JSP页面中合适的位置,就会自动引用这个JSP文件

第二种:动作include:<jsp:include page="public.jsp" />,同样也能引用该jsp文件显示在当前页面中。

那这两种有什么区别呢?其实就是转译方式不同而已,第一种指令include,他会将本身jsp和包含的jsp合并起来,然后转译成java文件,然后去编译执行,返回。而第二种动作include,就是各自转译各自的,public.jsp会单独转译成Java文件并执行,然后他们如何互相访问呢,他们是在服务器端以java文件的形式互相访问的,本身.java会在服务器访问public.java,然后把返回的结果,显示到页面中。明白了吧。

在include包含中,我们可以传递参数,指令include因为是最终会转译在一起,所以不需要传参,在public.java中直接使用本身的变量即可,但是在动作include中就需要传递参数了,格式为:

<jsp:include page="public.jsp">
 <jsp:param name="year" value="20181023" />
 </jsp:include> 

传递一个name是year的参数,在public.jsp中使用的话,通过隐式对象request获取该参数,<%=request.getParameter("name")%>即可显示在页面中了。其实就相当于两个类之间传递参数了,通过一个request对象传递的。

三:JSP的跳转、作用域以及隐式对象:

1. JSP中是如何跳转的呢?其实JSP的跳转就相当于servlet中的响应跳转,是通过<%%>java代码快实现的,同样也分为客户端跳转和服务器端跳转。

客户端跳转:在一个go.jsp文件中,<%  response.sendRedirect("hello.jsp")   %>只写这一句,当访问go.jsp时,就自动跳转到hello.jsp中去了,当然这里也可以调到servlet一个道理。

服务器跳转:go.jsp中写:request.getRequestDispatcher("hello.jsp").forward(request, response);即可完成服务器端跳转,也可以跳到servlet。但是jsp提供了简单化的写法:<jsp:forward page="hello.jsp"/>,这样也可完成服务器跳转。服务器端跳转没有发起新请求,而是服务器直接去访问了要访问的那个文件。

2. 隐式对象:JSP提供了很多隐式对象,一共有九个。隐式对象的意思就是,在代码中不需要定义,可以直接使用的对象。分别为:request,response,out ,pageContext, session,application ,page,config,exception

request代表请求对象,

response代表响应对象,

out代表输出对象,

pageContext代表当前页面作用域,

session代表当前会话作用域,

application代表当前所有页面作用域也就是整个web项目,

page代表的当前对象,就相当于该jsp文件被转译为servlet实例化之后的this一样。

config对象可以获取一些在web.xml初始化的一些参数,如下:

<servlet>
    <!-- 把 testconfig.jsp配置为一个 servlet 不止类能配置为servlet,jsp也可以-->
    <servlet-name>testconfig</servlet-name>
    <jsp-file>/testconfig.jsp</jsp-file>
    <!-- 配置初始化参数 -->
    <init-param>
        <param-name>database-ip</param-name>
        <param-value>127.0.0.1</param-value>
    </init-param>
</servlet>
<!-- 将路径 testconfig映射到testconfig.jsp -->
<servlet-mapping>
    <servlet-name>testconfig</servlet-name>
    <url-pattern>/testconfig</url-pattern>
</servlet-mapping>

在jsp页面中使用时:<%=config.getInitParameter("database-ip")%>通过config对象就可以获取到初始化的参数了。不过一般很少使用。

exception对象为异常显示,一般用来当一个jsp页面的代码运行出错了,就会跳转到一个专门用来报错的对不起页面,此时就用到了exception对象了,具体使用如下:

①. 准备一个try.jsp
设置errorPage="catch.jsp",表示有异常产生的话,就交给catch.jsp处理
故意在里面造成数组越界异常

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="catch.jsp"%>
<%
    int[] a = new int[10];
    a[20] = 5;
%>


②. 准备一个catch.jsp
设置 isErrorPage="true",表示当前页面可以使用exception对象

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
     
<%=exception%>

此时访问try.jsp时,会跳转到catch进行处理,了解即可

3. 作用域:

JSP一共有四个作用域,分别是:

pageContext表示当前页面有效,requestContext表示一个请求有效,sessionContext表示一次会话有效,applicationContext表示全局有效,所有用户共享。

这四个作用域分别可对应四个隐式对象的使用方法:pageContext、request、session、application。这四个对象都可以通过setAttribute和getAttribute传入或者获取参数来传递数据,例如,

传递:application.setAttribute("name","zhangsan");获取可以:application.getAttribute("name")

需要注意的是:request这个对象的作用域是一次请求有效,也就是说客户端完整的一次请求这个数据可以传递,如果发起了新的请求,上一次请求时设置的setAttribute的值就获取不到了,即客户端跳转时,无法传递request参数值,服务器端跳转时,没有发起新请求,所以会传递该request的值。

四:cookie和session

cookie是用来干嘛的呢?session又是干嘛的呢?我们日常使用的网站通常会有提示浏览器记住密码的提示,选中之后,我们以后一段时间登录该网站就不需要输入密码了,但是我们如果立即清除了cookie数据信息,则就会失效,cookie就是这个作用的。

1. cookie,cookie是一种浏览器和服务器交互数据的方式,它是由服务器端创建,然后传递给客户端,客户端保存在浏览器本地,当,下次访问网页时,直接带着这个本地的cookie去访问。

2.session,session的意思就是一次访问会话,从打开浏览器,访问该网址开始,session就被创建了,知道关闭浏览器或者超过session的失效时间时,该session才会被回收销毁。可以在tomcat中设置session的有效时间,在tomcat/conf/web.xml中的session-timeOut值。一般默认为30分钟。

3. session和cookie是什么关系呢?他们两个其实是密不可分的,session中存放着一些信息,每一个session都会有对应的一个sessionId,我们把这个id存放在cookie中,代表这个id对应这个session,当我们带着这个存着sessionId的cookie去访问服务器时,服务器可以根据cookie中的值快速定位到我们要访问的session值。相当于一把钥匙开一把锁的含义。

五. JSTL的使用:

JSTL就是我们经常看到和使用过的c:、fmt:、sql:等标签,也就是标准标签库。

1. 使用JSTL首先需要导入相应的jar包:jstl.jar和standard.jar

2. 在页面中通过指令告诉页面进行设置:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>引入c:标签。

3. c:的使用,<c:set var="name" value="${'zhang'}" scope="request" />   --   就相当于request.setAttribute("name","zhang")

<c:out value="${name}" />       相当于 <%=request.getAttribute("name")%>

<c:remove var="name" scope="request" />    相当于<%request.removeAttribute("name")%>

4. forEach的用法,上面我们讲了用JSP如何循环的把list集合中的数据显示出来,现在我们使用forEach来完成。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%
    List<String> heros = new ArrayList<String>();
    heros.add("塔姆");
    heros.add("艾克");
    heros.add("巴德");
    heros.add("雷克赛");
    heros.add("卡莉丝塔");
    request.setAttribute("heros",heros);
%> 
<!-- 使用jsp中的for循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
    <td>id</td>
    <td>name</td>
</tr>   
<%
int i =0;
for (String hero : heros) {
i++;
%> 
<tr>
    <td><%=i%></td>
    <td><%=hero%></td>
</tr>  
<%}%>   
</table> 
<br>
<!-- 使用JSTL中的c:forEach 循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
    <td>id</td>
    <td>name</td>
</tr>
<c:forEach items="${heros}" var="hero" varStatus="st"  >
    <tr>
        <td><c:out value="${st.count}" /></td>
        <td><c:out value="${hero}" /></td>
    </tr>
</c:forEach>
</table>

其中在forEach中 items就是需要遍历循环的对象,var就是自定义的一个对象,可以自动变换类型,varStatus就是该对象的状态。

5. JSTL中还有很多使用方法,例如fmt的格式化数字和格式化时间,fn:的对字符串的处理等。这里不再赘述

六:EL表达式

1. 这样开头,我们在JSP中,页面之间传递参数,例如从1.jsp到2.jsp,我在1中session。setAttribute("name","zhang")那我在2中可以使用session.getAttribute("name")获取,那用EL表达式的话可以直接<%=${name}%>即可获取。同时如果是服务器端传递回来的对象或者参数,在客户端都可以通过${}来获取值,简单吧。如果是传递来的对象的话,并且该对象有相应的getter和setter方法,则可以直接通过.获取对象的属性,例如服务器端传回来一个hero对象,

则:<input type="text" name="hero" value="${hero.name}">可以直接调用hero.getName显示该hero的name属性。

2. 如果四个作用域同时拥有相同的key("name"),那EL表达式${name}会取谁的值呢?这就涉及到作用域优先级的问题,从高到低分别是:pageContext>request>session>application

3. EL表达式如何获取响应地址中传回来的参数呢?这样:${param:name}就可以得到参数name的值了。

4. 还有一些EL表达式进行数字验证和判断的使用方式,内容比较多,这里不一一介绍了,有兴趣的同学可以自行百度吧。

例如:判断是否:${number ge 10? "成年人":"未成年人" }  判断number是不是大于等于10,是就是成年人,否则未成年人

感谢大家的阅读,以上学习笔记来自HOW2J

猜你喜欢

转载自blog.csdn.net/qq_41908550/article/details/83311480