jsp

什么是JSP?

 JSP是Java Server Pages的缩写,JSP的本质是Servlet,因为JSP最终会编译成Servlet才能运行【每个jsp页面在第一次被访问时,web容器都会把请求提交给Java程序。Java程序先将JSP编译成_jspServlet,然后按照Servlet的调用方式进行调用。在第一次访问的时候会比较慢,因为要编译成Servlet,如果JSP没有变化,就不会进行再次编译,因此访问速度不会向第一次访问那样慢】。对于JSP而言,写JSP就像写html,但不同的是HTML为用户提供的是静态数据,而JSP允许在HTML页面中嵌入Java代码,受Java程序的控制,从而为用户提供动态的数据。

JSP的基本语法

 JSP有4种基本语法,用于在静态HTML页面中编写Java代码,形成jJSP页面。

  • JSP注释

<%-- JSP注释的内容 --%>

 还有一种注释是HTML页面的注释,该注释在文章中没法打出来,那就说说这两个注释的区别吧,JSP的注释在网页中查看源代码的时候看不到JSP被注释掉的内容,但是HTML注释的内容在网页中是可见的,这就表明了JSP的注释不会被发送到客户端。

  • JSP申明:JSP申明用于申明变量和方法,就如在Java中申明变量和方法一样。但是在JSP 中申明变量和方法不需要定义类。

<% ! 申明的变量或方法 %>

  • JSP输出表达式

 输出表达式用于在JSP页面中输出变量值或者方法返回值。输出表达式末尾不能有分号存在。

<% = 输出表达式 %>

  • JSP脚本
     JSP脚本里可包含可执行的Java代码,Java代码通过JSP脚本被嵌入到HTML页面中。在JSP脚本中不能够定义方法。

<% Java可执行代码 %>

e.g.
 在JSP页面中执行数据库查询指令

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




jsp数据库查询


<%
/* 注册数据库驱动 */
 Class.forName("org.postgresql.Driver"); 
/*连接数据库  */
 Connection connection= DriverManager.getConnection("jdbc:postgresql://localhost:5432/test", "postgres", "123456"); 
 Statement statement = connection.createStatement();
 ResultSet resultSet = statement.executeQuery("select * from test_table");
%>

    <%
        while(resultSet.next())
        {
    %>
           
    <%
        }
    %>
<%=resultSet.getString(1)%> <%=resultSet.getString(2)%>

 注意:
  一定要在发布的服务器中加入数据库驱动哦!不然会出错的。

JSP的编译指令

 JSP一共有三个编译指令,分别是page,taglib和include指令。它们的通用语法为

<%@ 编译指令名 属性名2 = “属性值1”  属性名2 = “属性值2”...... %>
page指令

 page指令通常位于页面的最顶端,并且一个JSP页面可以拥有多个page指令,page指令的语法为:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
taglib指令

  taglib指令用于定义和访问标签库。其语法为:

<%@ taglib uri="" prefix=" "  %>

其中uri是定义标签库的URI,prefix是指定标签库的前缀,即当你要使用改标签库的语法的时候会将前缀带上,例如JSTL的标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>,在使用的时候格式是这样的XXX

include指令

 include指令可以将外部文件嵌入到当前的JSP页面中,include既可以包含静态的文本,也可以包含动态的JSP页面。include指令的语法为:

<%@ include file="XXX" %>

如果被嵌入的文件是动态的,建议使用指令,在稍后会讲解到该指令

JSP的动作指令

 JSP有七个动作指令,动作指令与编译指令不同,编译指令是在JSP被编译成Servlet 的时候起作用,而动作指令是可以替换成JSP脚本的,它是JSP脚本的标准化写法。

 JSP的7个动作指令:

  • jsp:include:用于引入动态的JSP页面。使用该指令是将被导入页面的body里面的内容引入到JSP页面中。其语法格式为:

或者


  
     
*该种语法表示了在加入的页面中有增加了请求的参数。
   *
  • jsp:param:用于参数的传递。但是必须和支持他的标签一起使用,例如 jsp:include。
  • jsp:forward:执行页面转向,将页面的请求发送到下一个页面。它既可以转发静态HTML页面,也可以转发动动态的JSP页面。其语法为:

  • jsp:plugin:因该指令的使用场景并不多,所以没有描述该指令。
    最后的这三个指令都是与JavaBean相关,
  • jsp:useBean:创建一个JavaBean实例,jsp:useBeande 的语法为:

它其中包含了这么多的参数,怎么说呢,它就相当于在Java当中创建一个实例,id,beanName,class,type就分别表示Java实例中的ID,属性名,类名以及属性类型,其中scope的值有:
(1) . page:JavaBean实例在本页面中有效。
(2) . request:本次请求有效,通过httpRequest.getAttribute()获取对象。
(3) . session:本次session内有效,通过httpSession.getAttribute()获取对象。
(4) . application:本应用内有效,通过application.getAttribute获取对象。

  • jsp:setProperty:设置JavaBean实例的属性值。语法格式为:

  • jsp:getProperty:获取JavaBean实例的属性值。语法格式为:

以上两种指令语法中的name表示Java实例中的实例名,property表示Java实例中的属性名,其中setProperty和getProperty分别对应Java实例中的set和get方法。

JSP的9个内置对象

 JSP中有9个内置对象,这9个内置对象依次是:

名称 描述 作用域 常用方法
request 用户端请求,此请求会包含来自 GET/POST 请求的参数 request getAttribute(String attrName);setAttribute(String attrName,Object attrValue);getParameter(String paramName);getParameterValues(String paramName)等
response 用于重定向 Page sendRedirect(String url);getOutputStream()等
session 对象会话,当客户端浏览器与站点进行连接时,会话开始,当客户端关闭浏览器时会话结束。 Session getAttribute(String attrName);setAttribute(String attrName,Object attrValue);
application JSP所属的web应用本身 Application getAttribute(String attrName);setAttribute(String attrName,String attrValue);
pageContext JSP上下文,使用该对象可以访问页面中的共享数据 Page getServletContext();setServletContext();
page 页面本身,servlet中的this,作用为生成servlet类,能用page的地方就可以用this Page
out JSP页面的输出流 Page
config JSP的配置信息 Page getInitParameter(String paramName);getInitParameters();
exception 页面中的异常和错误,只有当页面的编译指令page为isErrorPage="true"时,该对象才可以使用 Page getMessage();printStackTrace();

forward与redirect的区别

forward(转发) redirect(重定向)
执行forward后依然是上一次的请求 执行redirect后生成了第二次请求
forward的目标页面可以访问原请求的参数,因为还是同一个请求,所有原请求的参数属性全部存在 redirect的目标页面不能访问原请求的参数,因为是第二次请求了,所有原请求的参数等属性全部丢失
地址栏的请求URL不会改变 地址栏的请求URL会改为重定向的目标URL,就相当于重新在地址栏输入了URL并按了回车

cookie和 session的区别
  1、 cookie: cookie将信息存放在客户端机器中,除非超出cookie的生命周期,通常保存的是不重要的信息。
 2、session:session机制通常用于保存客户端的状态信息,这些状态信息需要保存到Web服务器的硬盘上,所以要求session的属性值必须是可序列化的,否则将会引发不可序列化的异常。并且session范围内的属性可以在多个页面的跳转之间共享,一旦浏览器关闭,session范围内的属性将会全部丢失。

EL表达式(Expression Language)

 EL表达式语言是一种简化的数据访问方式,使用表达式语言可以方便的访问JSP的隐含对象和JavaBeans组件。EL表达式语法的格式为:${expression}

 ${student.name}:获取javaBean的某个属性
 ${student.list[0]}:访问有序集合某个位置的元素
 ${map.key}:获得map集合中指定key的值

 EL表达式也支持算数运算符或逻辑运算符,如:{10%3}等。

EL表达式的隐式对象

 EL表达式有11个隐式对象,

  • pageContext :可以通过pageContext获取以上所有对象;与JSP的pageContext内置对象相同。${pageContext.request.contextPath}是在实际工程中最常用的
...
  • pageScope:获取page范围内的属性值。
  • requestScope :获取request范围的属性值。
  • sessionScope :获取session范围的属性值。
  • applicationScope : 获取application范围的属性值。
  • param :获取请求的参数值。
${param.name} 获取name的值。
  • paramValues :用于获取请求的参数值,但获取的是属性值为数组的属性值,返回的是一个String[]数组。
  • header :用于获取请求头的属性值。
  • headerValues :用于获取请求头的属性值,但获取的是属性值为数组的属性值,返回的是一个String[]数组。
  • initParam :用于获取请求web应用的初始参数。
${initParam.初始化参数名} 来获取在 web.xml 中定义了初始化参数 的参数名
  • cookie :用于获取指定的cookie值。

在 EL 的 11 个内置对象中,除了 pageContext 外,其它 10 个内置对象,其类型均为java.util.Map 类型

JSTL表达式(JSP Standard Tag Library)

 JSTL是Apache 已经定义的一套标准的标签库规范,称JSP标准标签库。当我们想要在JSP页面中使用JSTL标签,需要导入jstl.jar和standard.jar两个jar包,以及在JSP页面中导入标签库。
例如:

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

JSP中常用的JSTL标准标签库:

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

JSTL标签库中常用标签

-标签:其用途和程序中的if用途一样

 
      XXX
  
  • 标签:可以将集合里面的内容循环出来

        ${item.属性名 }

遍历Map集合


   key =  ${entry.key} , value = ${entry.value}

  • 标签
将value的值储存到varName 变量之中

- 标签:这三个标签是配合使用的,表示if....else if ...else

  
   
        XXX
  
  
       XXX
  
  
     XXX
  
 

标签中可以存在多个标签,但只能有一个 标签。

  • 标签:日期格式转换标签

value :用来格式化的时间或日期

type: 指定格式化的是日期还是时间,或者两者都是取值范围:date,time,both
pattern: 自定义格式化样式 ,如yyyy-MM-dd HH:mm:ss
dateStyle 日期的格式化样式
timeStyle 时间的格式化样式
timeZone 指定使用的时区
var 存储格式化后的结果
scope 指定存储的范围

  • fn:contains 函数 : 判断在源字符串中是否包含目标字符串,其语法为
fn:contains(String source,String target),返回值为Boolean类型,
例如:fn:contains(“ QiQi”,"Qi"),判断字符串QiQi中是否包含Qi,
运用于EL表达式中:${fn:contains(“ QiQi”,"Qi")}
  • fn:indexOf 函数:索引函数,在源字符串中查找目标字符串,索引由0开始,如果索引不到目标字符串返回-1。返回类型为 int。

${fn: indexOf (“ Qiqi”,"qi")},返回值为2

  • fn:substring 函数:用于获取源字符串中的特定子字符串。
fn:substring(String source,int beginIndex,int endIndex)
${ fn: substring (“Tomcat”,0,3)},返回值为Tom,此为包前不包后,相当于大于等于beginIndex,小于endIndex。
  • fn:trim 函数:用于将源字符串中的开头和末尾的空格删除。

${fn:trim(“ Qiqi ”)},除去前后空格,返回值为Qiqi。

  • fn:length 函数:用于返回字符串中的字符的个数,或者集合和数组的元素的个数

${fn:length(source)}

你可能感兴趣的:(jsp)