jsp/servlet学习笔记(核心编程)jsp部分
jsp
jsp最终需要转换成servelt,并进行编译,在请求期间实际上是编译的servlet
jsp擅长生成大量组织有序的结构化HTML或其他字符数据组成的页面。servlet擅长生成为进制数据,构建数据多样的页面,以及执行输出很少或者没有输出的任务(重定向)
1.jsp仅在修改后第一次访问时才会转换成servlet并进行编译;
2.载入到内存中初始化和执行遵循servlet的一般规则
基本语法:第十一章
<%...%>
jsp调用动态代码策略
1.直接调用(使用及少量代码)
2.简介调用java代码(开发单独实用工具类,只在jsp中调用工具所需的java代码)
3.实用Bean
4.使用MVC
5.使用jsp表达式
6.使用定制标签
jsp脚本元素类型
1.<%=java Expression%> 求值后插入到servlet输出中
2.<%java Code%>的scriptlet,他们将插入到select的_jspService方法
3.<%!Field/Method Declaration%>的声明,它们将插入到servlet类的定义中,不属于任何己有的方法
限制jsp中的java代码
最好将java代码放在封装放在WEB_INF/classes/包,然后使用一两句java代码去调用
不管编写什么样的java类,类文件都要部署在WEB_INF/classes/包中。
所有的类最好都放在包中
一、jsp表达式的应用
<%=java Expression%> 该式子在气质转化成字符串插入到页面中。求值是在运行期间执行。因此可以访问到请求中的所有信息。
为了简化表达式,可以使用多个预定义变量。_jspService方法(在jap页面生成的servlet中,等同于doGET)的局部变量就会使用什么名称
就表达式来说,最重要的是对象:
request response session out application(ServletContext)由Web应用中所有servlet和jsp页面共享的数据结构
out实际上是jsp中getWrite修改相对应的PrintWrite
表达式xml语法 <jsp:expression>..</jsp:expression>
一定要小写
二、scriptlet
编写scriptlet完成更复杂的任务,可以将任意代码插到_jspService方法中去调用
<% java Code%>
将Word导入HTML(不需要在相应文件那里指定类型。jsp的jspWirte会对文档进行缓冲)
<% response.setContentType("application/msword")%>
表达式不以分号结尾,而scriptle包涵java代码必须以分号结尾
<jsp:scriptlet>java code</jsp:scriptlet>
尽量的避免html代码和scriptle混合使用,有的时候为了把后面html内容包含到if...else中去可能会使用这种方法
<%if(math.random() < 0.5) {%>
<H1> Have e nice day<H1>
<%} else {%>
<H1> Have e nice day<H1>
<%}%>
等同于
if(math.random() < 0.5) {
out.println("<H1> Have e nice day<H1>")
} else {
out.println("<H1> Have e nice day<H1>")
}
三、使用声明 插入到servlet类的主定义体中
<%! Field or Method Definition%>
一般不产生输出。可以包含任何字段或代码。但不要覆盖doget,dopost init等代码
可以使用jspInit或者jspDestory对页面进行初始化和清理
相当于在servlet类里面重新定义了一个继承了HttpJspPage接口的类,类中包含声明中的代码。然后再_jspService中调用该代码
<jsp:declaration>Field or Method Definition</jsp:declaration>
_jspService方法中的隐式变量(其实也就是内置的局部变量)
request response out session application
config(该页ServletConfig) page(相当于this) exception(错误页) pageContext类(该类拥有getRequest,getResponse,getSession以及getSession方法)
第十二章 控制所生成servlet结构 JSP Page
<% directive attribute="value"%>
jsp中主要有三种指令 page include taglib
page控制servlet结构
include 将一个文件插入jsp页面中
taglib 自定义标签
page:
import属性:
<%@ page import="package.class",...%>
使用类必须放在WEB-INF/Classes中
contentType和pageEncoding属性:
<%@ page contentType="MIME-Type; charset=character-Set" %>
相当于
<% request.setContentType("...");%>
可以引入电子表格 原书253页
更改语言:
<%@ page pageEncoding="Shite_JIS";%> 日语
session属性:
<%@ page session="true"%> 是否启用session
isELIgnored属性:
buffer和autoFlush属性:缓冲区大小与自动清空缓冲区
<%@ page buffer="32Kb" autoFlush="true"%>
info属性:定义一个在servlet中通过getServletInfo方法获取的字符串
<%@ page info="someMessage"%>
errorPage和isErrorPage属性:
<%@ page erroPage="errprPage URL"%> 当页面发生错误转到错误页面
<%@ page isErrorPage="true"%> 是否可以作为其他页面的错误页面
错误页面放在WEB-INF中,防止用户直接访问
isThreadSafe 废弃 SingleThreadModel设计不好
extends属性:
指定jsp页面所生成类的超类
<%@ page extends="package.class"%>
language属性:指定脚本语言
<%@ page language="java"%> 不用管 默认java
<jsp:directive.directiveType attribute="value">
如:
<jsp:directive.page import="java.util.*" >
第十三章 jsp包含文件和applet
jsp:include动作 请求期间包含页面
html页面 jsp页面 纯文本 servlet输出等
与RequestDispatcher类中的include方法完全相同
<jsp:include page="relation-oath-to-resource"/>
次级属性flush:页面包含时是否清空主页面输出流
任何时候,凡是由服务器处理的,都要按照当前web应用进行解释。只有浏览器去处理的时候,才会相对于服务器根目录去解释
默认被包含的页面与主页面使用同一个请求参数
可以使用 jsp:param增加请求参数
<jsp:include page="relation-oath-to-resource">
<jsp:param name="id" value="a123">
</jsp:include>
jsp:param会被包含的页面优先采用
include指定
<%@ include file="Relative url"%>
jsp:include在请求期间激活,只有请求时才起作用
include指令在页面转化期间激活,难维护
jsp:include只有在被包含页面发生请求时才会编程成servlet,因此include指令更为强大
<%-- Navbar.jsp modified 9/1/03 --%>
<%@ include file = "Navbar.jsp"%>
添加注释时,修改被包含文件可自动更改修改日期
<jsp:directive.include file="...">
转发请求 使用jsp:forword可获得辅助页面的完整输出
但不推荐这么做,因为这样主页面不能含有任何输出。
可以使用servlet调用RequsetDispather的forword方法
jsp:plugin 添加applet
第十四章 JavaBean组件在jsp文档中的应用
优点:不需要java语法 对象共享简单 请求参数与对象属性之间方便对应起来
系统会首先寻找Bean对象,找不到在创建对象
特点:
1.必须拥有一个0参数的构造函数
2.不应该由公开的实例变量(字段)
3.持续性的值应该通过set/getXxx方访问
bean基本任务
jsp页面中,主要使用三种构建和操作javaBean操作javaBean组件
1.<jsp:useBean id="beanname" class="Package.Class"/>
<%ClassName beanname = new ClassName();%>
2.<jsp:getProperty name="beanname" property="propertyName"/>
<%=beanname.propertyName()%>
3.<jsp:setProperty name="beanname" property="propertyName" value="propertyValue"/>
<% beanname.propertyName("propertyValue");%>
<jsp:setProperty name="beanname" property="*"/>
属性自动关联 简化操作
type="可以声明的变量类型是父类或者接口"
共享属性 scope
scope="page" page作用域表示:处理当前请求,加bean对象绑定到局部变量外,还应该放在PageContext里面,servlet可以通过预定义变量pageContext的getAttribute访问。一般省略不写
scope="request"
表示将bean对象绑定到局部变量外,还会写入HttpServletRequest中,从而通过getAttribute访问它。在页面跳转时会共享请求对象
scope="session"
表示将bean对象绑定到局部变量外,还会写入HttpSession中,从而通过getAttribute访问HttpSession中的对象。
scope="application"
表示将bean对象绑定到局部变量外,还会写入ServletContext中,在整个web应用中共享。通过ServletContext的getAttribute访问获取。
Bean可以自动转换String int double类型 且对大小写敏感
模拟构造函数,在第一次访问时初始化变量
<jsp:useBean id="counter" class="CounterClass" scope="applicaion">
<jsp:setproperty name="counter" property="fristPage" value="Share,jsp"
</jsp:useBean>