标签:style class blog code java http
前言:原本呢,是打算只写个JSP的内置对象总结,但是没想到这个家伙的JSP总结非常不错,我就拿来用了。
借鉴地址:http://www.cnblogs.com/cyjch/archive/2012/03/28/2420798.html
用来定义在产生的类文件中的类的属性和方法(成员变量)。可声明类(即是内部类)。
由于servlet是工作在多线程环境下,所以尽量不要在service方法体外声明成员变量。
<%!.....%> //声明时要加"!",属于类成员,最先加载,可写于任何位置;不加则是脚本的局部变量,必须调用前写。
如:
<%!String hello="Hello, World!";%> //变量的声明 <%=hello%> //变量的调用 <%! private int counter=0; public int count(){ return ++counter;} %> //函数的声明 <h1><%=count()%></h1> //函数的调用
声明规则:
1) JSP中声明的变量和方法对应于Servlet中的实例方法和实例变量。这些将被同时请求该页面的所有用户所共享;
2) 在使用变量或方法前须先定义(不是说声明变量的位置在页面中要处于使用变量的前面,而是指变量不声明不能使用);
3) 声明的变量或方法的作用域为当前页面或包含的页面;
4) 语句间以分号分隔。
<% java代码 %>
是一段可以在处理请求时间执行的Java代码。可以产生输出,也可以是一些流程控制语句。
在代码段中定义的变量为service方法中的局部变量。
<% System.out.println("Hi,I like JSP."); %> //在控制台打印出,网页上没显示 <% out.println("Hi,I like JSP."); %> //打印在网页上 <% Connection conn=DriverManager.getConnection(); Statement st=conn.createStatement();
String sql="select * from users"; ResultSet rs=st.executeQuery(sql); //…… %>
问:能否在JSP脚本里定义方法?
答:不能! //脚本相当于方法,不能在方法里定义方法
<%!public void helloworld(){}%> //可以声明方法 <% public void helloworld(){}%> //编译出错;脚本不能定义方法
<%! int i=100;%> //成员变量 <% int i=101;%> //_jspService()方法中的局部变量 <%=i%> //同一文件里,局部变量优先
1) 你使用的脚本语言决定了脚本小程序的规则;
2) 语句间以分号分隔;
3) 可以使用默认的对象、import进的类、declaration声明的方法和对象以及useBean tag中声明的对象。
<%=……%> // "="号
在JSP请求处理阶段计算他的值,表达式生成的代码是Service方法中的一个代码片断。
JSP对于声明的处理:1、计算表达式的值
2、将值转换成String
3、用out.println发送标签;把数据输出至页面的当前位置
<%="Hello,JSP world!"%> //out.println("Hello,JSP world");
<%=name%> //<%!String name="GiGi";%> out.println(name); <%=new java.util.Date()%> //out.println(new java.util.Date());
表达式规则:
1) 你使用的脚本语言决定了脚本小程序的规则;
2) 执行的顺序为从左到右;
3) 分号不能用于表达式。
指令用于从JSP发送信息到容器上。用来设置全局变量,声明类,要实现的方法和输出内容等。
指令在JSP整个文件内有效。它为翻译阶段提供了全局信息。
<%@......%> // "@"符号
指令包括:page、include、taglib
import、session、errorPage、isThreadSafe
页面的语言、内容类型、字符集、页面编码
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
language:java唯一值,表示脚本中使用的编程语言
contentType:设置了内容的类型和静态页面的编码 (告诉浏览器以什么编码显示)
pageEncoding:页面本身的编码格式 (写页面时用的编码格式)
上面的代码等价于servlet里: response.setContentType("text/html; charset=gbk");
(1)import:导入其他的包和类; 其中,JSP默认导入的包是java.lang.*
<%@page import="java.util.Date"%> //具体的包和类 <%@page import="java.sql.*"%> //包下的所有类 <%@page import="java.util.*, java.io.*, java.net.*"%> //连写,逗号分隔
(2)Session:指示当前的jsp是否参与会话 (默认为true; 参与会话)
通过指令使当前页面与session不可会话: <%@page session="false"%>
session="true"时,可用内建对象session直接访问会话,例如:
<%
session.setAttribute("username","maxwell");
String name = (String)session.getAttribute("username");
%> <%=name%>
(3)errorPage:
isErrorPage:Jsp页面中出现异常的处理方式
对于有可能出现异常的页面:
<%@page errorPage="error.jsp"%> //异常时会跳转到处理异常的页面;这页面自己写
在有可能异常的地方打印原因: throw new Exception("数据库连接出错");
对于处理异常的页面(error.jsp)里:
<%@page isErrorPage="true"%>,其中使用<%=exception.getMessage() %>把异常信息打印出来
(4)isThreadSafe——此属性已经不再使用(已废弃)
当前Jsp页面是否线程安全 default--->true
<%@page isThreadSafe="true"%> //普通的Servlet,可以并发处理用户请求
<%@page isThreadSafe="false"%> //相当于Servlet实现了SingleThreadModel
把目标页面的内容包含到当前页面,产生页面叠加以后的输出效果 //相当于将两个页面合并;编译时就包含进来
<%@include file="foot.jsp"%> //可插入任意位置
留在JSTL里讲解。
编译器会忽略掉此类注释中的内容(客户端的源码看不见)
<%-- JSP注释;可多行 --%> <%// java 单行注释 %> <%/* java multi lines comments */%> <%/**java 特有的注释*/%>
编译器会执行此类注释中的代码(客户端的源码看得见)
<!-- html风格注释 --> //等价于out.println("<!-- html风格注释 -->")
这种注释方式不好的地方就是当页面注释信息太多的时候会增大服务器的负荷。
还有注释信息需要在网络上传输,从而降低效率;内部程序员的测试数据一般不能写在这种注释中,以免泄露。
JSP源文件处理分成二个阶段:
页面被编译成一个Java类,所有的HTML标记和JSP标记都被转换创建一个Servlet。这时,脚本和表达式还没有被执行;
发生在服务器,将一个客户端请求指向JSP页面。
一个请求对象创建、解析以及提交给编译好的JSP对应的servlet。
当这个servlet处理请求的时候它执行先前在JSP中定义的处理脚本小程序和表达式。
a. 过度使用脚本代码使用JSP页面混乱和难以维护;
b. 脚本代码降低JSP二个主要的优点:软件重用和代码分开
只在组件功能无能为力或需要有限的脚本时使用。
通过引入JavaBean,JSP才能较好的把页面展示与业务逻辑分离。
其中,业务逻辑放到后台的Java Bean中,减少JSP中的脚本代码,有利于程序的可维护性与可重用性。
形式:
<jsp:useBean id = "BeanName" class = "className" sope="范围域">
id ——声明bean对象的标识符,方便其他地方使用
class——bean对象的类型,注意要使用完全限定名
scope——java bean对象的共享范围(page、request、session、application)
page:当前页面范围(范围最小,生命周期最短)
request:同一个请求范围 (forward,include)
session:同一个会话(30分钟不使用,会自动结束)
application:同一个应用(范围最大,生命周期最长) ServletContext
例如:
SuperGirl <jsp:useBean id="girl" class="com.tarena.vo.SuperGirl" scope="session"/>
等价于:
<% SuperGirl girl=(SuperGirl)session.getAttribute("girl"); if(girl==null){ girl = new SuperGirl(); //对应 id 和 class session.setAttribute("girl",girl); //对应 scope 的值 } %>
可以用表达式获得bean的值:
<%=girl.getName();%>
形式:
<jsp:setProperty name="JavaBean对象名" property="JavaBean属性名" value="属性值"/>
例子:
<jsp:setProperty name="girl" property="name" value="Lily"/>
等价于:
<% girl.setName("Lily");%>
可以嵌套JSP表达式:
<jsp:setProperty name="girl" property="name" value=‘<%=request.getParameter("name")%>‘/>
Java Bean中的属性名与form中输入域的名字保持一致的话,可以使用通配符*,一次设置所有字段的值。
<jsp:setProperty name="" property="*"/>
形式:
<jsp:getProperty name="" property=""/>
name:标识具体的Bean对象,这与<jsp:useBean>标准动作中的id值相匹配
property:标识属性中的标识符。
标签:style class blog code java http
原文地址:http://www.cnblogs.com/GKinght/p/3810848.html