JSP基础

来源:互联网 发布:淘客网页源码 编辑:程序博客网 时间:2024/06/14 08:15

JSP(Java Server Pages)

JSP和HTML很相似,但是JSP允许在页面中编写JAVA代码,还可以在页面获取request等web开发常用的对象,实现与浏览器进行交互,被称为动态页面。

JSP最终会转变成servlet,访问JSP实际上就是访问servlet。形成的servlet会存放在Tomcat目录下的work中。

开发动态web资源的最佳实践:servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

JSP模板元素

JSP页面中的HTML内容。

JSP脚本表达式

语法:<%= 变量或表达式 %>

用于将程序数据输出到客户端。jsp引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(),所以jsp脚本表达式中的变量或表达式后面不能有分号。

JSP脚本片段

语法:<%多行java代码%>

用于在JSP页面中编写多行JAVA代码。JSP脚本片段中只能出现java代码,不能出现其他模板元素,JSP引擎在翻译JSP页面中,会将JSP脚本片段中的java代码将被原封不动地放到servlet的_jspService方法中。

一个JSP页面中的多个脚本片段的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。单个脚本片段中的java语句可以是不完整的,但是多个脚本片段组合后的结果必须是完整的java语句。

JSP声明

语法:<%!java代码 %>

JSP页面中编写的所有代码,默认会翻译到servlet的service方法中,而JSP声明中的java代码被翻译到_jspService方法的外面。

JSP声明可用于定义JSP页面转换成的servlet程序的静态代码块、成员变量和方法。多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。JSP隐式对象的作用范围仅限于servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

JSP注释

语法:<%--注释信息--%>

JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。

JSP指令

语法:<%@ 属性名=“值”%>

如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。JSP指令是为JSP引擎而设计的,他们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面。

在JSP2.0规范中共定义了三个指令:page指令、include指令、taglib指令。

include指令:语法:<%@ include file=”“%>,这种包含是静态包含,它包含的所有JSP会编译成一个servlet。

request.getRequestDispatcher().include(request,response):这种包含是动态包含,它包含的JSP会编译成各自的servlet。

静态包含(编译时包含)性能比动态包含(运行时包含)好。

JSP标签

也称为Jsp Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成JSP页面难以维护。

例如:

<jsp:forward page=""></jsp:forward>,web.xml中配置首页时,地址是不能直接写servlet的。<jsp:include page=""></jsp:include>---动态包含<jsp:param name="" value=""/>

<jsp:useBean>:用于在指定的域范围内查找指定名称的javaBean对象:如果存在则直接返回该javabean对象的引用,如果不存在则实例化一个新的javabean对象并将它以指定的名称存储到指定的域范围中。

<jsp:useBean id="beanName" class="package.class" scope="page|request|session|application">Body</jsp:useBean>,body部分的内容只在<jsp:useBean>标签创建javaBean的实例对象时才执行。

<jsp:setProperty>:用于设置和访问javabean对象的属性。

<jsp:setProperty name="person" property="name" param="请求参数名"><jsp:setProperty name="person" property="*"/>---用所有请求参数为bean赋值。

<jsp:getProperty>标签用于读取javabean对象的属性,也就调用javabean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。

<jsp:getProperty name="beanIstanceName" property="PropertyName">

JSP映射

//在web.xml中设置<servlet>    <servlet-name>xxx<servlet-name>    <jsp-file>/x.jsp</jsp-file></servlet><servlet-mapping>    <serlvet-name>xxx</servlet-name>    <url-pattern>/xx.html</url-pattern></servlet-mapping>

JSP的运行原理

每个JSP页面在第一次被访问时,web容器都会把请求交给JSP引擎(一个java程序)去处理,jsp引擎先将JSP翻译成一个_jspServlet,然后按照servlet的调用方式进行调用。由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问时,JSP引擎如果发现JSP没有发生变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。

JSP的中文乱码问题的一般解决方案

  1. 编写JSP的时候指定utf-8编码来保存在硬盘中。
  2. 在servlet中写上pageEncoding=”utf-8”通知服务器用utf-8编码来读取该JSP。
  3. 在JSP中写上contentType=”text.html;charset=utf-8”通知浏览器用utf-8来读取JSP形成的servlet。

JSP的九大隐式对象

JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用—Request,Response,Session,Application,Page,Config,Out,Exception,pageContext。

Out对象

用于向客户端发送文本数据。out对象是通过调用pageContext对象的getOut()方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。

JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。

只有向out对象中写入了内容,且满足下面任一条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
1. 设置page指令的buffer属性关闭了out对象的缓存功能。
2. out对象的缓冲区已满。
3. 整个JSP页面结束。

PageContext对象

PageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境。这个对象不仅封装了对其它8大隐式对象的引用,自身还是一个域对象,可以用来保存数据,还封装了web开发中经常涉及到的一些常用操作。

通过pageContext来获取隐式对象的技术用在自定义标签开发技术里面。

pageContext作为域对象,作用范围仅限于页面范围。该对象还封装了访问其他域的方法:
- PageContext.APPLICATION_SCOPE…代表各个域的常量。
- pageContext.findAttribute(“”);查找属性的顺序: page->request->session->application

PageContext类中定义了一个forward方法和两个include方法来分别简化和代替RequestDispatcher.forward方法和include方法。

JavaBean

javaBean是一个遵循特定写法的java类,这个java类必须具有一个无参的构造函数,属性必须私有化,私有化的属性必须通过public类型的方法暴露给其他程序,并且方法的命名也必须遵循一定的命名规范。

JSP开发模式

  1. JSP+javabean:javabean用于封装业务数据,JSP即负责处理用户请求,又显示数据。
  2. JSP+servlet+javabean:servlet负责处理用户请求,JSP负责数据显示,javabean负责封装数据。

三层架构程序

  • web层:servlet,jsp
  • 业务逻辑层:service,javabean
  • 数据访问层(dao层):dao

三层架构程序的包结构

  • cn.fjh.domain—javabean
  • cn.fjh.dao—操作数据库接口
  • cn.fjh.dao.impl—操作数据库实现
  • cn.fjh.service—接口
  • cn.fjh.service.impl—实现
  • cn.fjh.web.controller—请求控制器
  • cn.fjh.web.listencer—监听器
  • cn.fjh.web.filter—过滤器
  • cn.fjh.utils—工具类
  • Junit.test—测试包

WEB-INF/jsp保存网站所有jsp,禁止别人直接访问jsp。

原创粉丝点击