jsp

2018-06-29  本文已影响0人  小任务大梦想

什么是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注释的内容 --%>

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

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

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

<% = 输出表达式 %>

<% Java可执行代码 %>

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp数据库查询</title>
</head>
<body>
<%
/* 注册数据库驱动 */
 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");
%>
<table>
    <%
        while(resultSet.next())
        {
    %>
        <tr>
            <td><%=resultSet.getString(1)%></td>
            <td><%=resultSet.getString(2)%></td>
        </tr>   
    <%
        }
    %>
</table>

</body>
</html>

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

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"%>,在使用的时候格式是这样的<c:forEach>XXX</c:forEach>。

include指令

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

<%@ include file="XXX" %>

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

JSP的动作指令

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

 JSP的7个动作指令:

<jsp:include page="请求的页面"></jsp:include>

或者

<jsp:include page="请求的页面">
&emsp;&emsp;<jsp:param value="值" name="参数名称" />
    </jsp:include> 
*该种语法表示了在加入的页面中有增加了请求的参数。
&emsp;&emsp;<jsp:include page="请求的页面?参数名称=参数值"></jsp:include> *

<jsp:forward page="转发的页面地址" /></jsp:forward>

<jsp:useBean id="" beanName="" class="" scope="page" type=""></jsp:useBean>

它其中包含了这么多的参数,怎么说呢,它就相当于在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 property="" name=""/>

<jsp:getProperty property="" name="" />

以上两种指令语法中的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表达式也支持算数运算符或逻辑运算符,如:{(1==2) ? 3:4 },{10%3}等。

EL表达式的隐式对象

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

<form id="form" method="post" action="${pageContext.request.contextPath}/knowledge/?m=knowledgeForm">
   ...
</form>
${param.name} 获取name的值。
${initParam.初始化参数名} 来获取在 web.xml 中定义了初始化参数 的参数名

在 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标签库中常用标签

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

 <c:if test="${判断条件}">
      XXX
  </c:if>
<c:forEach items="${list }" var="item" varStatus="status">
        ${item.属性名 }<br/>
    </c:forEach>

<c:forEach>遍历Map集合

<c:forEach items="${map}" var="entry">
   key =  ${entry.key} , value = ${entry.value}
</c:forEach>
将value的值储存到varName 变量之中
<c:set value="value" var="varName" />

-<c:choose> <c:when> <c:otherwise> 标签:这三个标签是配合使用的,表示if....else if ...else

<c:choose>  
 <c:when test="${判断条件1}">  
        XXX
</c:when>  
<c:when test="${判断条件2}">  
       XXX
</c:when>  
<c:otherwise>  
     XXX
</c:otherwise>  
</c:choose> 

在<c:choose> 标签中可以存在多个<c:when>标签,但只能有一个<c:otherwise> 标签。

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

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

fn:contains(String source,String target),返回值为Boolean类型,
例如:fn:contains(“ QiQi”,"Qi"),判断字符串QiQi中是否包含Qi,
运用于EL表达式中:${fn:contains(“ QiQi”,"Qi")}

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

fn:substring(String source,int beginIndex,int endIndex)
${ fn: substring (“Tomcat”,0,3)},返回值为Tom,此为包前不包后,相当于大于等于beginIndex,小于endIndex。

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

${fn:length(source)}

上一篇 下一篇

猜你喜欢

热点阅读