JSP技术

  在传统的JavaWeb开发中,有三个“运动员”,分别是:

  1.JSP:主要做动态页面的展示;

  2.Servlet:接收前端页面数据,返回前端页面响应,连接数据库,内部实现对应逻辑;

  3.JavaBean:一个普通类,又分为实体bean 和业务bean。

  在JavaWeb的开发历史中,主要有两种开发模式,分别是:

  1.JSP + JavaBean

  2.JSP + Servlet + JavaBean

  第二种模式更符合MVC开发理念:

  M:Model模型,JavaBean及其四种作用域;

  V:View视图 ,JSP;

  C:Controller控制器,Servlet。

  由于Servlet特殊的位置和作用设计,使得Servlet 无疑是我们三个“运动员”中最累的一个,既要负责接收,又要负责响应,还要做数据库的数据连接操作,甚至业务逻辑。大量的工作如果都交由Servlet一个类完成,结果必然是代码很多,动辄一个Servlet千行万行打不住。随之带来的问题就是代码管理困难,团队协作没有门路,将来交接维护更是不可能的事情。

所以,我们要降低Servlet这个类的责任,分离其部分功能,由此衍生出分离后的三层结构如下:

1.web层(表现层)

核心就是一个Servlet类,主要职能:接收数据,响应数据,调用业务逻辑层完成逻辑交互。

2.service层(业务逻辑层)

处理核心业务逻辑,负责web层和dao层的统一调度。

3.dao(数据访问对象层) 

数据库的增删改查,实体封装,数据库和实体的对应。

由于JavaWeb开发是一项庞大的工程,我在本文主要介绍jsp技术,后续再介绍其他方面。

  JSP全称Java Server Pages,是一种用于开发动态web资源的技术。JSP实际上是Servlet,对静态资源进行了处理。所以,JSP可以视为这样的等式:

  jsp = html + java

  html:静态内容; 

  servlet:服务器端的小应用程序,适合编写java逻辑代码,可以作为控制器(获取表单数据、处理业务逻辑、分发转向等); 

  jsp:代码显示模板,重点在于显示数据,适合编写输出动态内容,但不适合编写java逻辑。

  相比较而言,Serlvet做界面麻烦,但是写java代码方便;JSP做动态数据显示简便,但是如果真的出现大量Java代码,整体结构又会很混乱。

  1.JSP的模版元素中包括网页的静态内容,如html标签和文本。

  2.JSP的脚本中包括:

  (1)小脚本 <% java代码 %>;

  (2)表达式 <%= 2+3 %> 等价于out.print(2+3);

  (3)声明   <%! %> 表示在类中定义全局成员,和静态块。 

  3.JSP注释 

  JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量 

  网页注释:    特点:不安全,费流量

  4.三个指令

  JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

   JSP语法:<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2” ...%>

  如:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  

    <%@ page language="java" %> 

    <%@ page import="java.util.*" %> 

  在JSP 2.0规范中共定义了三个指令: 

  (1)page指令

   作用:用于定义JSP页面的各种属性。

  属性:import 和java代码中的import是一样的

    <%@ page import="java.util.Date,java.util.List"%>

    或者:<%@ page import="java.util.Date"%>  <%@ page import="java.util.List"%>

  JSP会自动导入以下的包:

    import java.lang.*;

    import javax.servlet.*;

    import javax.servlet.http.*;

    import javax.servlet.jsp.*;

  session: 是否会自动创建session对象。默认值是true;

  buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb.

  errorPage: 如果页面中有错误,则跳转到指定的资源。

  errorPage="/uri" 如果写“/”则代表当前应用的目录下,绝对路径。如果不写“/”则代表相对路径。

  isErrorPage: 是否创建throwable对象。默认是false;

  contentType: 等同于response.setContentType("text/html;charset=utf-8");

  pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。<%@ page  pageEncoding="gbk" %>

  isELIgnored: 是否支持EL表达式。 默认是false 。 

  (2)include指令

   静态包含:把其它资源包含到当前页面中。<%@ include file="/include/header.jsp" %>

  动态包含:

   两者的区别:翻译的时间段不同

  前者:在翻译时就把两个文件合并

  后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

   原则:能用静的就不用动的。

  (3)taglib指令   

  作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

  5.六个动作   

  使用标签的形式来表示一段java代码。JSP有6个动作:    

 动态包含  如:
   请求转发
   设置请求参数 
   创建一个对象
   给指定的对象属性赋值
   取出指定对象的属性值

  7.九个内置对象

   指在JSP的<%=%> 和<% %>中可以直接使用的对象。 

对象名

类型

说明

request

javax.servlet.http.HttpServletRequest

 

response

javax.servlet.http.HttpServletResponse

 

session

javax.servlet.http.HttpSession

由session="true"开关

application

javax.servlet.ServletContext

 

exception

java.lang.Throwable

由isErrorPage="false"开关

page

java.lang.Object当前对象this

当前servlet实例

config

javax.servlet.ServletConfig

 

out

 javax.servlet.jsp.JspWriter

字符输出流,相当于 printWriter对象

pageContext

 javax.servlet.jsp.PageContext

 

   其中,pageContext本身也是一个域对象,它可以操作其它三个域对象(request,session,application)的数据。 

  findAttribute(String name); 自动从page request session application依次查找,找到了就取值,结束查找。 

  在普通类中可以通过PageContext获取其他JSP隐式对象,自定义标签时就使用。

  8.四大域对象  

PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。 
  ServletRequest: request  存放的数据在一次请求(转发)内有效。使用非常多。 
  HttpSession: session 存放的数据在一次会话中有效。使用的比较多,如:存放用户的登录信息,购物车功能。 
  ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。

   9.EL表达式

  EL表达式:expression language 表达式语言,要简化jsp中java代码开发。它不是一种开发语言,是jsp中获取数据的一种规范。

  EL表达式只能获取存在4个作用域中的数据。 

 ${u} 原理: pageContext.findAttribute("u");
  对于传递的参数  url?name=tom  这样表示:${param.name}
  EL获取对于null这样的数据,在页面中表现为空字符串。
  ${u.name} == u.getName()方法,点(.)运算符相当于调了getter方法,点后页面跟的是属性名。
  []运算符:点能做的,它也能做; 它能做的,点不一定能做。
  ${student.name}== ${student['name']} == ${student["name"]}
  ${empty str},判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true。
  三元运算符,${empty str?"您还未下单":"您已下单"}

  EL有11个隐式对象:

EL隐式对象引用名称

类型

JSP内置对象名称

说明

pageContext

javax.servlet.jsp.PageContext

pageContext

一样的

pageScope

java.util.Map

没有对应的

pageContext范围中存放的数据,页面范围

requestScope

java.util.Map

没有对应的

请求范围数据

sessionScope

java.util.Map

没有对应的

会话范围数据

applicationScope

java.util.Map

没有对应的

应用范围数据

param

java.util.Map

没有对应的

一个请求参数

paramValues

java.util.Map

没有对应的

重名请求参数

header

java.util.Map

没有对应的

一个请求消息头

headerValues

java.util.Map

没有对应的

重名请求消息头

initParam

java.util.Map

没有对应的

web.xml中全局参数

cookie

java.util.Map

没有对应的

key:cookie对象的name值

  10.JSTL

  JSTL(JavaServerPages Standard Tag Library),JSP标准标签库。使用JSTL可以实现JSP页面中的逻辑处理,如判断、循环等。

  在JSP页面添加taglib指令:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  

  JSTL的常用标签有:

  (1)通用标签:set,out,remove等。  

设置变量:
  输出数据>:
  移除变更:
  移除后输出:

  (2)条件标签:if,choose  


  
    结果为true
  
  
    
      第一名
    
    
      不是第一名
    
  

  (3)迭代标签:foreach  

#普通循环
  
    ${i}
  
  #迭代器
  
    ${item}-----${vs.index}------${vs.count}--------${vs.first}-------${vs.last}
   

你可能感兴趣的:(JavaEE)