JSP

指令标记,动作标记和自定义标记

指令标记

page标记
  <%@page contentType="text/java;charset=UTF-8"%>

contentType:设置MIME类型和字符编码

import:导入类

pageencoding:定义jsp的编码格式

include标记
  <%@include file="1.jsp"%>

导入整个页面

动作标记

include标记
  <jsp:include page="">
    <jsp:param value="" name=""></jsp:param>
  </jsp:include>

通过jsp:include可以导入页面(通过动态标签的方式)

在标签对里面使用jsp:param可以在导入页面的时候传参

forward标记

执行页面跳转——转发

page属性指定转发的页面

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

通过forward标签可以转发到指定页面

注:forword转发后导航栏网址不变,其目标是简化问题的解决


JSP内置对象

概念:在JSP页面的java程序片和java表达式中可以直接使用的局部变量

  • request
  <%
      request.setCharacterEncoding("utf-8");//设置编码格式
      String s = request.getParameter("");//接受单个参数值
      String[] ss = request.getParameterValues("");//接受多个参数值
      request.setAttribute("属性名","属性值");
      request.getRequestDispatcher("show.jsp").forward(request,response);//另一种转发方法
  %>
  • response
  <%
  		response.sendRedirect(url);//重定向
  		response.setHeader("refresh","1;url=");//刷新
  %>

注:区别于转发和重定向,转发是服务端操作,浏览器地址不改变,重定向是浏览器操作,浏览器地址栏改变

  • out

response.getWriter获取的对象

out.print显示结果

  • session
    • public void setAttribute(String key,Object value)
    • public Object getAttribute(String Key)
    • public void removeAttribute(String key)

从打开浏览器开始到关闭浏览器结束

实质上是请求中的方法 request.getSession()

session不同于请求和响应,不会随着请求响应的变化而关闭

  • application

以服务器开始为开始,以服务器结束为结束

application的方法和session基本相同

  • page、pageContext、config、exception

page对象以页面为存活时间,无论是转发,重定向都会消失

page对象是当前JSP页面转译生成的java文件所创建的对象

pageContext对象可以获取当前页面的访问对象及相关页面信息

setAttribute方法

getAttribute方法

findAttribute()方法

javabean

javaBean也分为三大类,分别是成员类、工具类、判别类

三个基本动作标记

  • <jsp:useBean>
  • <jsp:getProperty>
  • <jsp:setProperty>

使用useBean标签寻找/创建对象

  <jsp:useBean id="对象名" class="类全名(包括包名)" scope="page/request/session/application">

useBean的运行步骤

  1. 最开始先从scope(内置对象)中寻找相应存在attribute中的id(对象名)

    这一步用了getAttribute的方法

  2. 如果没有,就向外层寻找,比如scope写的是request,当request中没有时,向Session或application中寻找

    这一步用了findAttribute方法

  3. 如果找到在1,2的步骤中找到,则标签返回此对象

  4. 如果都没找到,则在scope中的Attribute中根据class(类)实例化此对象


使用访问器

<jsp:getProperty name="对象名" property="成员变量名">

使用此访问器可直接访问对象中某一成员变量,返回值是该成员变量。

此访问器除直接访问变量之外,还可以访问以get/is开头的方法,直接返回其方法的返回值


使用修改器

<jsp:setProperty name="对象名" property="*"> 

使用此修改器能直接修改对象中成员变量的属性

需注意,Property取值为*,必须保证传参时变量名称一致

由于表单中传过来的数据类型都是String 类型的,Jsp内在机制会把这些参数转化成Bean属性对应的类型。


<jsp:setProperty name="对象名" property="成员变量名" param="赋值来源参数名">

使用此修改器能直接修改对象中成员变量的属性

同方式一,也会把param传来的参数自动转化成成员变量的类型

<jsp:setProperty name="对象名" property="成员变量名" value="变量或表达式">

使用此修改器能直接修改对象中成员变量的属性

同方式一,也会把value中的值(表达式或字符串)自动转化成成员变量的类型


Servlet

继承于HttpServlet类的一个子类

Jsp相当于把java程序片卸载网页中,Servlet相当于把网页写在;Java类中


常用方法

public void init(ServletConfig config)

public void doGet/doPost(HttpServletRequest request,HttpServletResponse response)

publie void destroy()


步骤

  1. 创建Servlet类

  2. 在web.xml文件中注册Servlet对象,格式:

    <web-app>
      ……
      <servlet>
        <servlet-name>Servlet对象名</servlet-name>
        <servlet-class>Servlet类全名</servlet-class>
      </servlet>
      <servlet-mapping>
      	<servlet-name>Servlet对象名</servlet-name>
        <url-pattern>/格式</url-pattern>
      </servlet-mapping>
    </web-app>
    
  3. 或者在创建Servlet时利用@WebServlet完成配置Servlet:格式

    @WebServlet("/格式")
    public class XxxServlet extends HttpServlet{
    
    }
    
  4. 亦或者多配置一些信息(对象名,多个格式,或者是带一些默认值)

    @WebServlet(name="对象名字",
               urlPatterns={
                  "/格式1",
                  "/格式2"
                }
               initParams={
                 @WebInitParam(name="param",value="123"),
                   ……
               }
               ……)
    

内置对象的一些特殊的定义方法

因为request和response是形参,可以直接使用。但是其他的内置对象需要单独定义

out:

PrintWriter out = resp.getWriter();

session:

HttpSession session = req.getSession();//非严格形式
//严格形式
HttpSession session = req.getSession(false);//使用已有的Session
if(session == null){
  session = req.getSession(true);//当没有Session时,创建新的Session
}

application:

ServletContext application = this.getServletContext();

EL

Expression Language(表达式语言)

EL的底层操作就是调用内置对象方法

表达式的构成

  1. 隐式对象

    param、paramValues、initParam

    jsp内置对象EL隐式对象
    request.getParameter("a")${param.a}
    request.getAttribute("a")${requestScope.a}
    session.getAttribute("a")${SessionScope.a}
    pageConpage.findAttribute("a")${a}
    获取a中的属性value${sessionScope.a.value}

scope中文释义:范围

  1. 常量:boolean、整数、浮点数、字符串和null

  2. 运算符:算术运算符、关系运算符、逻辑运算符、空

JSTL

JSP Standard Tap Liberary(JSP标准标记库)

引入格式

<%@taglib  uri="路径及其类型" prefix="前缀"%>

标记库类型

  1. 核心标记库(core)——c
  2. 数据库访问标记库(sql)——sql
  3. XML标记库(xml)——x
  4. 国际化标记库(fmt)——fmt
  5. 函数标记库(functions)——fn

核心标记库

forEach
<c:forEach iterms="遍历源" var="元素" varStatus="指定遍历状态" begin="开始的索引值" end="结束的索引值" step="步长(默认值1)">
循环体
</c:forEach>

begin、end、step分别表示:起始序号,结束序号,跳跃步伐。

我们一般用<c:forEach> 来遍历需要的数据,为了方便使用,varStatus属性可以方便我们实现一些与行数相关的功能,如:奇数行、偶数行差异;最后一行特殊处理等等。

varStatus 是循环索引。先就varStatus属性常用参数总结下:

属性值功能
${status.index}输出行号,从0开始。
${status.count}输出行号,从1开始。
${status.current}当前这次迭代的(集合中的)项
${status.first}判断当前项是否为集合中的第一项,返回值为true或false
${status.last}判断当前项是否为集合中的最后一项,返回值为true或false

if
<c:if test="判断条件">
执行体
</c:if>

if用于单分支判断


choose、when和otherwise
<c:choose>
	<c:when test="判断条件">
    	执行体
    </c:when>
    ……
    <c:otherwise>最后一种操作</c:otherwise>
</c:choose>

choose、when和otherwise用于多分支判断

具体使用时可与if elseif else 与switch类比


set
<c:set var ="变量名" value="值" scope="变量储存的范围"/>

新建变量

<c:set target="Bean对象名" property="成员变量名" value="值" scope="成员变量的储存位置"/>

为对象成员变量赋值


url
<c:url var="存储url地址对象名" value="被重写的url" context="站点名" scope="变量储存范围"/>

该标签用于生成一个 URL 路径的字符串,该符串可用于 标记实现 URL 的链接,或者用于网页转发和重定向等

<c:url var="path" value="../login.jsp" scope="page"/>
<a href="${pageScope.path}">登录页面</a>

redirect
<c:redirect url="重定向地址" context="站点名"/>

重定向

注:例如url和redirect标记均可写成双标记形式,在中加入c:param标记传参


数据库访问标记库

setDataSource
<sql:dataSource diver="驱动串"
                url="连接串"
                user="用户名"
                password="密码"
                var="存储链接的变量"
                scope="存储对象的作用范围"/>

建立与数据库的连接源


query
<sql:query var="存储查询结果的变量"
           sql="sql语句"
           dataSource="数据源"
           startRow="起始行"
           maxRows="显示的最大行数"
           scope="存储对象的作用范围"/>

注:需使用查询结果变量的rows方法返回查询结果集

可使用c:foreach标签遍历结果集