最详细的jsp基础教程是什么_jsp是什么软件

最详细的jsp基础教程是什么_jsp是什么软件JSP系列教材(一)-教程通过Servlet进行整个网站的开发是可以的

JSP系列教材 (一)- 教程

通过Servlet进行整个网站的开发是可以的。 不过在Servlet中输出html代码,特别是稍微复杂一点的html代码,就会给人一种很酸爽的感觉。 
如果能够直接使用Html代码,然后在html中写java代码,就好了~ 
JSP … 就可以干这个事情。

步骤1:hello.jsp
步骤2:代码解释
步骤3:<%=

步骤 1 : hello.jsp

在web目录下下新建一个文件hello.jsp
访问网页

http://127.0.0.1/hello.jsp

注: 不需要重启tomcat

hello.jsp

<%@page contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*”%>

你好 JSP

<br>

<%=new Date().toLocaleString()%>

步骤 2 : 代码解释

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

是JSP的<%@page指令

contentType=”text/html; charset=UTF-8″

相当于response.setContentType(“text/html; charset=UTF-8”); 通知浏览器以UTF-8进行中文解码

pageEncoding=”UTF-8″

如果jsp文件中出现了中文,这些中文使用UTF-8进行编码

import=”java.util.*

导入其他类,如果导入多个类,彼此用,逗号隔开,像这样 import=”java.util.*,java.sql.*”

步骤 3 : <%=

<%=new Date().toLocaleString()%>

输出当前时间,相当于在Servlet中使用response.getWriter()进行输出

response.getWriter().println(new Date().toLocaleString());

JSP系列教材 (二)- 转译为Servlet


为什么JSP可以在html中运行java代码? 这是因为JSP被转译成了Servlet

步骤1:执行过程
步骤2:hello_jsp.java 为什么是Servlet

步骤 1 : 执行过程

1. 把 hello.jsp转译为hello_jsp.java
2. hello_jsp.java 位于
d:\tomcat\work\Catalina\localhost\_\org\apache\jsp
3. hello_jsp.java是一个servlet
4. 把hello_jsp.java 编译为hello_jsp.class
5. 执行hello_jsp,生成html
6. 通过http协议把html 响应返回给浏览器

执行过程

步骤 2 : hello_jsp.java 为什么是Servlet

在Servlet章节中,我们说HelloServlet是一个Servlet,不是因为它的类名里有一个”Servlet”,而是因为它继承了 HttpServlet
打开转译hello.jsp 后得到的hello_jsp.java,可以发现它继承了类
(D:\tomcat\work\Catalina\localhost\_\org\apache\jsp\hello_jsp.java)

org.apache.jasper.runtime.HttpJspBase

而HttpJspBase 继承了HttpServlet
所以我们说hello_.jsp.java 是一个Servlet

/*

 * Generated by the Jasper component of Apache Tomcat

 * Version: Apache Tomcat/7.0.64

 * Generated at: 2017-01-07 01:45:17 UTC

 * Note: The last modified time of this file was set to

 *       the last modified time of the source file after

 *       generation to assist with modification tracking.

 */

package org.apache.jsp;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

import java.util.*;

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =

          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;

  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {

    return _jspx_dependants;

  }

  public void _jspInit() {

    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();

    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());

  }

  public void _jspDestroy() {

  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, finaljavax.servlet.http.HttpServletResponse response)

        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;

    javax.servlet.http.HttpSession session = null;

    final javax.servlet.ServletContext application;

    final javax.servlet.ServletConfig config;

    javax.servlet.jsp.JspWriter out = null;

    final java.lang.Object page = this;

    javax.servlet.jsp.JspWriter _jspx_out = null;

    javax.servlet.jsp.PageContext _jspx_page_context = null;

    try {

      response.setContentType(“text/html; charset=UTF-8”);

      pageContext = _jspxFactory.getPageContext(this, request, response,

                null, true, 8192, true);

      _jspx_page_context = pageContext;

      application = pageContext.getServletContext();

      config = pageContext.getServletConfig();

      session = pageContext.getSession();

      out = pageContext.getOut();

      _jspx_out = out;

      out.write(“\r\n”);

      out.write(” \r\n”);

      out.write(“你好 JSP\r\n”);

      out.write(” \r\n”);

      out.write(“<br>\r\n”);

      out.write(” \r\n”);

      out.print(new Date().toLocaleString());

    } catch (java.lang.Throwable t) {

      if (!(t instanceof javax.servlet.jsp.SkipPageException)){

        out = _jspx_out;

        if (out != null && out.getBufferSize() != 0)

          try {

            if (response.isCommitted()) {

              out.flush();

            } else {

              out.clearBuffer();

            }

          } catch (java.io.IOException e) {}

        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);

        else throw new ServletException(t);

      }

    } finally {

      _jspxFactory.releasePageContext(_jspx_page_context);

    }

  }

}

JSP系列教材 (三)- 的7种页面元素


步骤1:页面元素
步骤2:<%=%>和 <%out.println()%>
步骤3:for循环

步骤 1 : 页面元素

jsp由这些页面元素组成:
1. 静态内容
就是html,css,javascript等内容
2. 指令
以<%@开始 %> 结尾,比如<%@page import=”java.util.*”%>
3. 表达式 <%=%>
用于输出一段html
4. Scriptlet
在<%%> 之间,可以写任何java 代码
5. 声明
在<%!%> 之间可以声明字段或者方法。但是不建议这么做。
6. 动作
<jsp:include page=”Filename” > 在jsp页面中包含另一个页面。在包含的章节有详细的讲解
7. 注释 <%– — %>
不同于 html的注释 <!– –> 通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了

页面元素

步骤 2 : <%=%>和 <%out.println()%>

<%=”hello jsp”%>

就相当于

<%out.println(“hello jsp”);%>

out是jsp的隐式对象,可以直接使用。一共有9种隐式对象,请参考 隐式对象 章节
注: <%=%> 不需要分号结尾,<%%> 需要以分号结尾,和java代码一样

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*”%>

<%=”hello jsp”%>

<br>

<% out.println(“hello jsp”);%>

步骤 3 : for循环

结合for循环在jsp里输出html是常见的做法。 只是第一次这么写会稍显别扭
下面是一段实例,以供参考

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) {%>

<tr>

    <td><%=word%></td>

</tr>

<%}%>

</table>

JSP系列教材 (四)- include包含其他页面的两种方式,以及其区别


每个网页的最下方都有 版权声明等信息。 如果不使用包含,那么每个网页都需要单独写,如果版权声明要修改,则需要很大的工作量。 
使用include的办法,只需要准备一个footer.jsp,然后在其他页面包含footer.jsp即可。 
修改的时候,只需要修改footer.jsp所有的页面就都修改了,维护成本降低了很多。 
include有两种方式指令include和动作include

步骤1:首先准备一个footer.jsp
步骤2:指令include
步骤3:动作include
步骤4:指令include和动作include的区别
步骤5:传参

步骤 1 : 首先准备一个footer.jsp

首先准备一个footer.jsp

<hr>

<p style=”text-align:center”>copyright@2016

</p>

步骤 2 : 指令include

通过指令

<%@include file=”footer.jsp” %>

在hello.jsp中包含该页面

指令include

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*”%>

你好  JSP

<%@include file=”footer.jsp” %>

步骤 3 : 动作include

通过动作

<jsp:include page=”footer.jsp” />

在hello.jsp中包含该页面

1661.png
uploading.4e448015.gif转存失败重新上传取消
动作include

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*”%>

你好  JSP

<jsp:include page=”footer.jsp” />

步骤 4 : 指令include和动作include的区别

通过之前的学习知道,JSP最后会被转译成Servlet
如果是指令include 

<%@include file=”footer.jsp” %>

footer.jsp的内容会被插入到 hello.jsp 转译 成的hello_jsp.java中,最后只会生成一个hello_jsp.java文件
如果是动作include 

<jsp:include page=”footer.jsp” />

footer.jsp的内容不会被插入到 hello.jsp 转译 成的hello_jsp.java中,还会有一个footer_jsp.java独立存在。 hello_jsp.java 会在服务端访问footer_jsp.java,然后把返回的结果,嵌入到响应中。

指令include和动作include的区别

步骤 5 : 传参

因为指令<%@include 会导致两个jsp合并成为同一个java文件,所以就不存在传参的问题,在发出hello.jsp 里定义的变量,直接可以在footer.jsp中访问。
而动作<jsp:include />其实是对footer.jsp进行了一次独立的访问,那么就有传参的需要。
如本例:
1. 在hello.jsp中使用动作<jsp:include,并通过<jsp:param 带上参数

<jsp:include page=”footer.jsp”>

    <jsp:param  name=”year” value=”2017″ />

</jsp:include>

2. 在footer.jsp中,使用request.getParameter(“year”)取出year

  • hello.jsp
  • footer.jsp

<%@page contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*”%>

你好 JSP

<%=new Date().toLocaleString()%>

<jsp:include page=”footer.jsp”>

    <jsp:param  name=”year” value=”2017″ />

</jsp:include>

<hr>

    <p style=”text-align:center”>copyright@<%=request.getParameter(“year”)%>

</p>


和Servlet的跳转一样,JSP的跳转也分服务端跳转和客户端跳转。

步骤1:首先准备 jump.jsp 
步骤2:客户端跳转
步骤3:服务端跳转

示例 1 : 首先准备 jump.jsp

首先准备一个jump.jsp 来分别演示客户端跳转和服务端跳转

示例 2 : 客户端跳转

jsp的客户端跳转和Servlet中是一样的。

response.sendRedirect(“hello.jsp”);

可以通过firefox的调试工具可以观察到访问jump.jsp返回302(临时客户端跳转),跳转到了hello.jsp

客户端跳转

<%

    response.sendRedirect(“hello.jsp”);

%>

示例 3 : 服务端跳转

与Servlet的服务端跳转一样,也可以使用

request.getRequestDispatcher(“hello.jsp”).forward(request, response);

或者使用动作,简化代码

<jsp:forward page=”hello.jsp”/>

服务端跳转

<jsp:forward page=”hello.jsp”/>


步骤1:cookie 在平时生活中的运用
步骤2:什么是cookie
步骤3:setCookie.jsp
步骤4:getCookie.jsp
步骤5:cookie原理示意图

步骤 1 : cookie 在平时生活中的运用

有的网站,登陆的时候,会出现一个选项,问你是否要一周内或者一个月内保持登陆状态。
如果你选了,那么一周之内,都不需要再输入账号密码。
这个功能,就是靠cookie来实现的

步骤 2 : 什么是cookie

Cookie是一种浏览器和服务器交互数据的方式。
Cookie是由服务器端创建,但是不会保存在服务器。
创建好之后,发送给浏览器。浏览器保存在用户本地。
下一次访问网站的时候,就会把该Cookie发送给服务器。

步骤 3 : setCookie.jsp

在web目录下创建一个文件 setCookie.jsp

Cookie c = new Cookie(“name”, “Gareen”);

创建了一个cookie,名字是”name” 值是”Gareen”

c.setMaxAge(24 * 60 * 60);

表示这个cookie可以保留一天,如果是0,表示浏览器一关闭就销毁

c.setPath(“/”);

Path表示访问服务器的所有应用都会提交这个cookie到服务端,如果其值是 /a, 那么就表示仅仅访问 /a 路径的时候才会提交 cookie

response.addCookie(c);

通过response把这个cookie保存在浏览器端
访问地址:

http://127.0.0.1/setCookie.jsp

通过HTTP调试工具也可以在Cookies这一栏看到

setCookie.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”javax.servlet.http.Cookie”%>

<%

    Cookie c = new Cookie(“name”, “Gareen”);

    c.setMaxAge(60 * 24 * 60);

    c.setPath(“/”);

    response.addCookie(c);

%>

<a href=”getCookie.jsp”>跳转到获取cookie的页面</a>

步骤 4 : getCookie.jsp

在web目录下创建文件getCookie.jsp
然后访问网页:

http://127.0.0.1/getCookie.jsp

Cookie[] cookies  = request.getCookies();

表示获取所有浏览器传递过来的cookie

if (null != cookies )

如果浏览器端没有任何cookie,得到的Cookie数组是null

for (int d = 0; d <= cookies.length – 1; d++) {

   out.print(cookies[d].getName() + “:” + cookies[d].getValue() + “<br>”);

}

遍历所有的cookie
可以看到name:Gareen,这个在setCookie.jsp中设置的cookie
注; JSESSIONID 这个不是我们自己设置的cookie,这是tomcat设置的cookie,会在下一章session的学习中用到
通过HTTP调试工具也可以看到浏览器在请求信息里提交了这个Cookie。

getCookie.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”javax.servlet.http.Cookie”%>

<%

    Cookie[] cookies = request.getCookies();

    if (null != cookies)

        for (int d = 0; d <= cookies.length – 1; d++) {

            out.print(cookies[d].getName() + “:” + cookies[d].getValue() + “<br>”);

        }

%>

步骤 5 : cookie原理示意图

cookie原理示意图

步骤1:健身房的储物柜
步骤2:什么是Session
步骤3:setSession.jsp
步骤4:getSession.jsp
步骤5:Session和Cookie的关系
步骤6:Session 原理示意图
步骤7:如果没有cookie,session如何工作
步骤8:session的有效期

步骤 1 : 健身房的储物柜

考虑这个场景:
李佳汜到健身房去练胸肌,首先领了钥匙,然后进了更衣间,把衣服,裤子,手机,钱包都放在盒子里面。
毛竞也到健身房,去练翘臀。首先领了钥匙,然后 进了更衣间,把衣服,裤子,手机,《Java 21天从入门到精通》也放在了一个盒子里,但是这个盒子是和李佳汜的是不同的。
健身房,就相当于服务器,盒子,就是会话Session。
切换到我们常见的购物网站的场景
李佳汜登陆天猫之后,在购物车里看到的物品是蜡烛和皮鞭
毛竞登陆天猫之后,在购物车里看到的物品是手铐和《Java 21天从入门到精通》

步骤 2 : 什么是Session

Session对应的中文翻译是会话。 
会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。

步骤 3 : setSession.jsp

session.setAttribute(“name”, “teemo”);

session对象保存数据的方式,有点像Map的键值对(key-value)
“name”是键,”teemo” 是值

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”javax.servlet.http.Cookie”%>

<%

   session.setAttribute(“name”, “teemo”);

%>

<a href=”getSession.jsp”>跳转到获取session的页面</a>

步骤 4 : getSession.jsp

session.getAttribute(“name”);

通过session,根据”name” 取出对应的名称

getSession.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”javax.servlet.http.Cookie”%>

<%

    String name = (String)session.getAttribute(“name”);

%>

session中的name: <%=name%>

步骤 5 : Session和Cookie的关系

回到健身房的储物柜这一段:
李佳汜和毛竞都有自己的盒子,那么他们怎么知道哪个盒子是自己的呢? 
通过钥匙就能找到自己的盒子了。
盒子对应服务器上的Session。
钥匙对应浏览器上的Cookie。

步骤 6 : Session 原理示意图

Session 原理示意图

步骤 7 : 如果没有cookie,session如何工作

如果浏览器把cookie功能关闭,那么服务端就无法获取jsessionid,每一次访问,都会生成一个新的session对象。
为了解决这个问题,可以使用

response.encodeURL(“getSession.jsp”)

response.encodeURL方法会把getSession.jsp这个url转换为

getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8

通过这个方式,提交jsessionid到服务器。 服务器根据这个jsessionid匹配到对应的session. 与session相关的功能,就可以正常工作了。

如果没有cookie,session如何工作

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”javax.servlet.http.Cookie”%>

<%

   session.setAttribute(“name”, “teemo”);

%>

<a href=”<%=response.encodeURL(“getSession.jsp”)%>”>跳转到获取session的页面</a>

步骤 8 : session的有效期

比如登录一个网站,登录后,在短时间内,依然可以继续访问而不用重新登录。
但是较长时间不登录,依然会要求重新登录,这是因为服务端的session在一段时间不使用后,就失效了。
这个时间,在Tomcat默认配置下,是30分钟。
可以通过 d:/tomcat/conf/web.xml 中的session-config 配置进行调整

session的有效期

JSP有4个作用域,分别是 
pageContext 当前页面 
requestContext 一次请求 
sessionContext 当前会话 
applicationContext 全局,所有用户共享

步骤1:pageContext
步骤2:requestContext 
步骤3:requestContext与服务端跳转
步骤4:requestContext与客户端跳转
步骤5:sessionContext 
步骤6:applicationContext 

步骤 1 : pageContext

准备setContext.jsp和getContext.jsp,分别表示向作用域设置数据,和从作用域获取数据。
pageContext表示当前页面作用域
通过pageContext.setAttribute(key,value)的数据,只能在当前页面访问,在其他页面就不能访问了。

pageContext
  • setContext.jsp
  • getContext.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%

    pageContext.setAttribute(“name”,”gareen”);

%>

<%=pageContext.getAttribute(“name”)%>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%=pageContext.getAttribute(“name”)%>

步骤 2 : requestContext

requestContext 表示一次请求。随着本次请求结束,其中的数据也就被回收。
常用写法是

request.setAttribute(“name”,”gareen”);

request.getAttribute(“name”)

但是也可以用pageContext来做,写成

pageContext.setAttribute(“name”,”gareen”,pageContext.REQUEST_SCOPE);

pageContext.getAttribute(“name”,pageContext.REQUEST_SCOPE)

不过不常用

  • setContext.jsp
  • getContext.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%

    request.setAttribute(“name”,”gareen”);

%>

<%=request.getAttribute(“name”)%>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%=request.getAttribute(“name”)%>

步骤 3 : requestContext与服务端跳转

requestContext指的是一次请求
如果发生了服务端跳转,从setContext.jsp跳转到getContext.jsp,这其实,还是一次请求。 所以在getContext.jsp中,可以取到在requestContext中设置的值
这也是一种页面间传递数据的方式

  • setContext.jsp
  • getContext.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%

    request.setAttribute(“name”,”gareen”);

%>

<jsp:forward page=”getContext.jsp”/>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%=request.getAttribute(“name”)%>

步骤 4 : requestContext与客户端跳转

客户端跳转,浏览器会发生一次新的访问,新的访问会产生一个新的request对象。
所以页面间客户端跳转的情况下,是无法通过request传递数据的。

  • setContext.jsp
  • getContext.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%

    request.setAttribute(“name”,”gareen”);

    response.sendRedirect(“getContext.jsp”);

%>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%=request.getAttribute(“name”)%>

步骤 5 : sessionContext

sessionContext 指的是会话,从一个用户打开网站的那一刻起,无论访问了多少网页,链接都属于同一个会话,直到浏览器关闭。 
所以页面间传递数据,也是可以通过session传递的。
但是,不同用户对应的session是不一样的,所以session无法在不同的用户之间共享数据。
与requestContext类似的,也可以用如下方式来做

pageContext.setAttribute(“name”,”gareen”,pageContext.SESSION_SCOPE);

pageContext.getAttribute(“name”,pageContext.SESSION_SCOPE)

  • setContext.jsp
  • getContext.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%

    session.setAttribute(“name”,”gareen”);

    response.sendRedirect(“getContext.jsp”);

%>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%=session.getAttribute(“name”)%>

步骤 6 : applicationContext

applicationContext 指的是全局,所有用户共享同一个数据
在JSP中使用application对象, application对象是ServletContext接口的实例
也可以通过 request.getServletContext()来获取。
所以 application == request.getServletContext() 会返回true
application映射的就是web应用本身。
与requestContext类似的,也可以用如下方式来做

pageContext.setAttribute(“name”,”gareen”,pageContext.APPLICATION_SCOPE);

pageContext.getAttribute(“name”,pageContext.APPLICATION_SCOPE)

  • setContext.jsp
  • getContext.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%

    application.setAttribute(“name”,”gareen”);

    System.out.println(application == request.getServletContext());

    response.sendRedirect(“getContext.jsp”);

%>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

<%=application.getAttribute(“name”)%>


JSP的隐式对象指的是不需要显示定义,直接就可以使用的对象,比如request,response 
JSP一共有9个隐式对象,分别是 
request,response,out 
pageContext, session,application 
page,config,exception

步骤1:request,response,out
步骤2:pageContext, session,application
步骤3:page
步骤4:config
步骤5:exception

步骤 1 : request,response,out

这三个已经很熟悉了
request 代表请求 请参考 request常见方法
response 代表响应 请参考 response 用法
out 代表 输出

步骤 2 : pageContext, session,application

pageContext 代表当前页面作用域
session 代表当会话作用域
application 代表当全局作用域
更多的关于作用域的请参考 作用域

步骤 3 : page

page 对象即表示当前对象
JSP 会被编译为一个Servlet类 ,运行的时候是一个Servlet实例。 page即代表this

page

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*”%>

page:<%=page%>

<br>

this:<%=this%>

步骤 4 : config

config可以获取一些在web.xml中初始化的参数。
在JSP中使用config比较复杂,需要如下几个步骤
1. 在web.xml中进行配置
2. 创建一个testconfig.jsp
通过config.getInitParameter(“database-ip”) 获取参数
3. 访问路径,获取web.xml中配置的参数

http://127.0.0.1/testconfig

注1: 不能通过 http://127.0.0.1/testconfig.jsp 获取参数,只能通过/testconfig路径
注2:这种用法不常见,不推荐使用

  • web.xml片段
  • testconfig.jsp

<servlet>

    <!– 把 testconfig.jsp配置为一个 servlet –>

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

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*”%>

database-ip: <%=config.getInitParameter(“database-ip”)%>

步骤 5 : exception

exception 对象只有当前页面的<%@page 指令设置为isErrorPage=”true”的时候才可以使用。
同时,在其他页面也需要设置 <%@page 指令 errorPage=”” 来指定一个专门处理异常的页面。
1. 准备一个try.jsp
设置errorPage=”catch.jsp”,表示有异常产生的话,就交给catch.jsp处理
故意在里面造成数组越界异常
2. 准备一个catch.jsp
设置 isErrorPage=”true”,表示当前页面可以使用exception对象

  • try.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;

%>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ isErrorPage=”true”%>

<%=exception%>


JSTL JSP Standard Tag Library 标准标签库 
JSTL允许开人员可以像使用HTML标签 那样在JSP中开发Java功能。 
JSTL库有core, i18n, fmt, sql 等等。 
i18n和sql用的很少,core和fmt在工作中会用到,本章节主要讲解core和fmt

步骤1:导入jar包
步骤2:set out remove
步骤3:if else
步骤4:choose
步骤5:forEach
步骤6:forTokens
步骤7:fmt:formatNumber 格式化数字
步骤8:fmt:formatDate 格式化日期
步骤9:fn:

步骤 1 : 导入jar包

为了能够在JSP 中使用JSTL,首先需要两个jar包,分别是jstl.jar 和standard.jar
可以在右侧下载
把这两个jar包放在web/WEB-INF/lib 下

导入jar包

步骤 2 : set out remove

在页面中使用JSTL需要在jsp中 通过指令进行设置

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

prefix=”c” 表示后续的标签使用都会以<c: 开头

<c:set var=”name” value=”${‘gareen’}” scope=”request” />

在作用域request中设置name,相当于
<%request.setAttribute(“name”,”gareen”)%>

<c:out value=”${name}” />

相当于 <%=request.getAttribute(“name”)%>

<c:remove var=”name” scope=”request” />

在作用域request中删掉name,相当于
<%request.removeAttribute(“name”)%>
作用域可以是pageContext, request, session, application, 参考 作用域

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″%>

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

<c:set var=”name” value=”${‘gareen’}” scope=”request” />

通过标签获取name: <c:out value=”${name}” /> <br>

<c:remove var=”name” scope=”request” /> <br>

通过标签获取name: <c:out value=”${name}” /> <br>

步骤 3 : if else

JSTL通过<c:if test=””> 进行条件判断
但是JSTL没有<c:else,所以常用的办法是在<c:if的条件里取反
配合if使用的还有通过empty进行为空判断
empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0

<%@ 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”%>

<c:set var=”hp” value=”${10}” scope=”request” />

<c:if test=”${hp<5}”>

    <p>这个英雄要挂了</p>

</c:if>

<c:if test=”${!(hp<5)}”>

    <p>这个英雄觉得自己还可以再抢救抢救</p>

</c:if>

<%

    pageContext.setAttribute(“weapon”, null);

    pageContext.setAttribute(“lastwords”, “”);

    pageContext.setAttribute(“items”, new ArrayList());

%>

<c:if test=”${empty weapon}”>

    <p>没有装备武器</p>

</c:if>

<c:if test=”${empty lastwords}”>

    <p>挂了也没有遗言</p>

</c:if>

<c:if test=”${empty items}”>

    <p>物品栏为空</p>

</c:if>

步骤 4 : choose

虽然JSTL没有提供else标签,但是提供了一个else功能的标签

<c:choose>

        <c:when test=”${hp<5}”>

    </c:when>

    <c:otherwise>

    </c:otherwise>

</c:choose>

我个人觉得看上去繁琐,还是习惯用<c:if test=”!” 来表示else

<%@ 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”%>

<c:set var=”hp” value=”${3}” scope=”request” />

<c:choose>

    <c:when test=”${hp<5}”>

        <p>这个英雄要挂了</p>

    </c:when>

    <c:otherwise>

        <p>这个英雄觉得自己还可以再抢救抢救</p>

    </c:otherwise>

</c:choose>

步骤 5 : forEach

可以在JSP中使用for循环,但是其可读性很差。 借助JSTL的c:forEach标签,可以改善可读性
在本例中,分别使用for循环和<c:forEach标签来演示遍历一个List的区别

<c:forEach items=”${heros}” var=”hero” varStatus=”st”  >

items=”${heros}” 表示遍历的集合
var=”hero” 表示把每一个集合中的元素放在hero上
varStatus=”st” 表示遍历的状态

<%@ 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>编号</td>

    <td>英雄</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>编号</td>

    <td>英雄</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>

步骤 6 : forTokens

<c:forTokens专门用于字符串拆分,并且可以指定多个分隔符

<%@ 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”%>

<c:set var=”heros” value=”塔姆,艾克;巴德|雷克赛!卡莉丝塔” />

<c:forTokens items=”${heros}” delims=”:;|!” var=”hero”>

    <c:out value=”${hero}” /> <br />

</c:forTokens>

步骤 7 : fmt:formatNumber 格式化数字

fmt 标签常用来进行格式化,其中fmt:formatNumber用于格式化数字
使用之前要加上

<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt”  prefix=’fmt’ %> 

<fmt:formatNumber type=”number” value=”${money}” minFractionDigits=”2″/>

<fmt:formatNumber 表示格式化数字
minFractionDigits 小数点至少要有的位数
maxFractionDigits 小数点最多能有的位数

fmt:formatNumber 格式化数字

<%@ 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”%>

<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt”  prefix=’fmt’ %> 

<c:set var=”money” value=”888.8″ />

<c:set var=”pi” value=”3.1415926″ />

最少两个小数点:

<fmt:formatNumber type=”number” value=”${money}” minFractionDigits=”2″/>

<br>

最多两个小数点:

<fmt:formatNumber type=”number” value=”${pi}” maxFractionDigits=”2″ />

步骤 8 : fmt:formatDate 格式化日期

fmt 标签常用来进行格式化,其中fmt:formatDate 用于格式化日期
和fmt:formatNumber 格式化数字一样,使用之前要加上

<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt”  prefix=’fmt’ %> 

<fmt:formatDate value=”${now}” pattern=”G yyyy年MM月dd日 E”/>

<fmt:formatDate value=”${now}” pattern=”a HH:mm:ss.S z”/>

<fmt:formatDate value=”${now}” pattern=”yyyy-MM-dd HH:mm:ss”/>

<fmt:formatDate 表示格式化日期
yyyy 表示年份
MM 表示月份
dd 表示日期
E 表示星期几
a 表示是上午还是下午
HH 表示小时
mm 表示分钟
ss 表示秒
S 表示毫秒
z 表示时区

fmt:formatDate 格式化日期

<%@ 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”%>

<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt”  prefix=’fmt’ %> 

<%

    Date now = new Date();

    pageContext.setAttribute(“now”,now);

%>

完整日期: <fmt:formatDate value=”${now}” pattern=”G yyyy年MM月dd日 E”/><br>

完整时间: <fmt:formatDate value=”${now}” pattern=”a HH:mm:ss.S z”/><br>

常见格式: <fmt:formatDate value=”${now}” pattern=”yyyy-MM-dd HH:mm:ss”/>


EL表达式非常好用,好用的吓死人 ~

步骤1:取值
步骤2:作用域优先级
步骤3:JavaBean概念
步骤4:获取JavaBean的属性
步骤5:结合JSTL的<c:forEach
步骤6:取参
步骤7:eq

示例 1 : 取值

不同版本的tomcat是否默认开启对EL表达式的支持,是不一定的。
所以为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored=”false”
使用EL表达式,非常简单
比如使用JSTL输出要写成

<c:out value=”${name}” />

但是用EL只需要

${name}

取值

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ isELIgnored=”false”%>

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

<c:set var=”name” value=”${‘gareen’}” scope=”request” />

通过标签获取name: <c:out value=”${name}” /> <br>

通过 EL 获取name: ${name}

示例 2 : 作用域优先级

EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性怎么办? 
EL会按照从高到低的优先级顺序获取 
pageContext>request>session>application

作用域优先级

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ isELIgnored=”false”%>

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

<c:set var=”name” value=”${‘gareen-pageContext’}” scope=”page” />

<c:set var=”name” value=”${‘gareen-request’}” scope=”request” />

<c:set var=”name” value=”${‘gareen-session’}” scope=”session” />

<c:set var=”name” value=”${‘gareen-application’}” scope=”application” />

4个作用域都有name,优先获取出来的是 : ${name}

示例 3 : JavaBean概念

EL可以很方便的访问JavaBean的属性,那么JavaBean是什么呢? 
JavaBean的标准
1. 提供无参public的构造方法(默认提供)
2. 每个属性,都有public的getter和setter
3. 如果属性是boolean,那么就对应is和setter方法
比如示例代码中的Hero类,默认提供了一个无参的public的构造方法。 同时每个属性都有getter和setter

package bean;

public class Hero {

    public int id;

    public String name;

    public float hp;

    public int damage;

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public float getHp() {

        return hp;

    }

    public void setHp(float hp) {

        this.hp = hp;

    }

    public int getDamage() {

        return damage;

    }

    public void setDamage(int damage) {

        this.damage = damage;

    }

}

示例 4 : 获取JavaBean的属性

获取JavaBean的属性,只需要通过.符号操作就可以了。
像这样 ${hero.name} ,就会自动调用getName方法了
注: 如果属性是boolean类型,那么就会自动调用isXXX方法了

获取JavaBean的属性

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ isELIgnored=”false” import=”bean.*”%>

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

<%

    Hero hero =new Hero();

    hero.setName(“盖伦”);

    hero.setHp(616);

    request.setAttribute(“hero”, hero);

%>

英雄名字 : ${hero.name} <br>

英雄血量 : ${hero.hp}

示例 5 : 结合JSTL的<c:forEach

EL还可以结合 JSTL的<c:forEach 使用,进一步简化代码
原代码中的 

<c:out value=”${hero}” />

可以简写为

${hero}

结合JSTL的<c: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);

%>

<table width=”200px” align=”center” border=”1″ cellspacing=”0″>

<tr>

    <td>编号</td>

    <td>英雄</td>

</tr>

<c:forEach items=”${heros}” var=”hero” varStatus=”st”  >

    <tr>

        <td>${st.count}</td>

        <td>${hero}</td>

    </tr>

</c:forEach>

</table>

示例 6 : 取参

EL表达式还可以做到request.getParameter(“name”) 这样的形式获取浏览器传递过来的参数
先把jstl.jsp代码改为如例所示,然后访问如下地址

http://127.0.0.1/jstl.jsp?name=abc

可以观察到获取了参数 name

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

    pageEncoding=”UTF-8″ import=”java.util.*” isELIgnored=”false”%>

${param.name}

示例 7 : eq

进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码
如例,一行代码就能起到其他好几行代码的效果

${killNumber ge 10? “超神”:”还没超神” }

例子中讲的是大于等于,除此之外的其他用法如下:
eq相等 ne、neq不相等,
gt大于, lt小于
gt大于, lt小于
gte、ge大于等于 
lte、le 小于等于 
not非 mod求模 
is [not] div by是否能被某数整除 
is [not] even是否为偶数 
is [not] odd是否为奇

<%@ 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”%>

<%

request.setAttribute(“killNumber”, “10”);

%>

c:if 的用法,运行结果:

<c:if test=”${killNumber>=10}”>

超神

</c:if>

<c:if test=”${killNumber<10}”>

还没超神

</c:if>

<br>

c:choose 的用法,运行结果:

<c:choose>

    <c:when test=”${killNumber>=10}”>

        超神

    </c:when>

    <c:otherwise>

        还没超神

    </c:otherwise>

</c:choose>

<br>

EL表达式eq的用法,运行结果:

${killNumber ge 10? “超神”:”还没超神” }

今天的文章最详细的jsp基础教程是什么_jsp是什么软件分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/78301.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注