JSP概述及基本语法
2016-12-11 20:46
435 查看
JSP技术
1. jsp是什么:是sun公司定义的一种规范.
JSP全称是JavaServer Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。JSP实际上就是Servlet。当在页面访问jsp页面的时候,服务器看到输入的是.jsp,就会去找jsp引擎,再把页面编译成一个servlet
2. jsp = html + java代码
JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。3. 服务器是如何调用并执行一个jsp页面
4.服务器如何把Jsp页面中的html排版标签发送到客户端
5.Jsp页面中的java代码服务器是如何执行
6.Web服务器在调用jsp时,会给jsp提供一些什么java对象
7. Jsp的最佳实践
Jsp用来做页面Servlet用来做业务逻辑
8.jsp的模板元素
JSP页面中的HTML内容称之为JSP模版元素9.JSP脚本片段
JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法:<%
多行java代码
%>
l注意:JSP脚本片断中只能出现java代码,不能出现其它模板元素,JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。
lJSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。
l在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
举例:
<%
intx = 10;
out.println(x);
%>
<p>这是JSP页面文本</p>
<%
inty = 20;
out.println(y);
%>
l多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);
l正规开发中的JSP中不应出现java脚本:标签封装
l单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:
<% for (int i=1; i<5; i++) { %> <H1>www.it315.org</H1> <% } %>
<body> <table border = 1 width = 200> <% for(int i = 1;i<=5;i++){ out.write("<tr><td>"); out.write(i+""); out.write("</td><td>"); out.write("aaa"); out.write("</td></tr>"); } %> </table> <hr> <table border = 1 width = 200> <% for(int i = 1;i<=5;i++){ %> <tr> <td><%=i+"" %></td> <td><%="aa" %></td> </tr> <% } %> </table> </body>
10.脚本表达式
JSP脚本表达式(expression)用于将程序数据输出到客户端语法:<%=变量或表达式 %>
举例:当前时间:<%= new java.util.Date() %>
<body> <% request.setAttribute("name", "张无忌"); %> 脚本表达式(输出一个变量):<%= request.getAttribute("name") %><br> </body>
JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
JSP脚本表达式中的变量或表达式后面不能有分号(;)
11.Jsp的声明
格式:<% ! %>作用: 可以定义类变量和类方法,实例变量和实例方法.
成为了内部类
<% %>在service()方法里面。
12.改变页面的编码和打开方式
Window--preference-----搜索jsp把jsp页面改为编译器打开:
Window-----preference-------General-------Editors-------File Associations
13.注释
HTML注释:<!-- -->,页面源码能看到Java注释: // /* */页面源码看不到
Jsp注释: <%-- --%> 页面源码看不到 (要是用<!---->也是可以注释jsp只是源码会看得到)
14.指令标签
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令:•page指令
•Include指令
•taglib指令
lJSP指令的基本语法格式:
<%@指令属性名="值"%>
举例:<%@page contentType="text/html;charset=gb2312"%>
l如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
例如:
<%@ pagecontentType="text/html;charset=gb2312"%>
<%@page import="java.util.Date"%>
也可以写作:
<%@ pagecontentType="text/html;charset=gb2312"import="java.util.Date"%>
page指令:
lpage指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习
惯,page指令最好是放在整个JSP页面的起始位置。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
language="java":支持java代码
import="java.util.*":要用到的类 唯一一个可以使用多个的属性
pageEncoding="UTF-8":页面使用的编码
autoFlush=”true”:自动刷新,缓存区满了,自动由服务端向客户端发送信息。
buffer=”8k”:缓冲区
info:相当于键值对
errorPage:当页面出现异常的时候,自动去到哪一个页面 errorPage="7.jsp"
isErrorPage:去到的一个错误页面 isErrorPage="true" 可以使用exception对象获取堆栈里面的错误信息
errorPage和isErrorPage只针对500的错误。
lerrorPage属性的设置值为一路径(相对或绝对),如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
l可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。
l如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
指定当出现404错误的时候跳转到页面8:
<error-page> <error-code>404</error-code> <location>/8.jsp</location> </error-page>
lJSP程序存在有与Servlet程序完全相同的中文乱码问题
ü输出响应正文时出现的中文乱码问题
ü读取浏览器传递的参数信息时出现的中文乱码问题
lJSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题
üJSP引擎将JSP源文件翻译成的Servlet源文件默认采用ISO8859-1编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP
源文件翻译成Servlet源文件时,需要进行字符编码转换。
ü如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。
l如何解决JSP引擎翻译JSP页面时的中文乱码问题
ü通过page指令的contentType属性说明JSP源文件的字符集编码
üpage指令的pageEncoding属性说明JSP源文件的字符集编码
include指令:
静态指令:<%@ %>
动态指令:<jsp: >
1.<%@include file=”” %> : 静态包含 (是指的代码的拷贝) (推荐)
指代码级别的包含,将目标页面的源码拷贝一份包含进来。
注意被包含的页面的path变量要删除,因为是把源码包含进来,会导致变量重复
2.<jsp:include page=“” > : 动态包含 (是指的将目标页面的执行结果的包含)
指执行目标页面,将结果包含进来。
linclude指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
l语法:
<%@include file=“被包含组件的绝对URL或相对URL"%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
细节:
被引入的文件必须遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSPfragments)作为静态引入文件的扩展名。
由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
taglib指令:
标签库指令,用于在JSP页面中导入标签库
15.动作标签
<jsp:include>标签<jsp:forward>标签
<jsp:param>标签
<jsp:include>标签:
<jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。
l语法:
<jsp:include page="relativeURL |<%=expression%>" flush="true|false" />
page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
<jsp:include>与include指令的比较
<jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
<jsp:forward>标签:
l<jsp:forward>标签用于把请求转发给另外一个资源。
l语法:
<jsp:forwardpage="relativeURL | <%=expression%>" />
üpage属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获
得。
<jsp:param>标签
l当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可
以使用<jsp:param>标签向这个资源传递参数。
l语法1:
<jsp:includepage="relativeURL | <%=expression%>">
<jsp:paramname="parameterName" value="parameterValue|<%= expression%>" />
</jsp:include>
l语法2:
<jsp:forwardpage="relativeURL | <%=expression%>">
<jsp:paramname="parameterName" value="parameterValue|<%= expression%>" />
</jsp:include>
l<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值
。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递
多个参数。
<body> <% request.setAttribute("name", "小龙女") ; %> <jsp:forward page="/9.jsp?age=100"> <jsp:param value="70" name="weight"/> <jsp:param value="北京" name="address"/> </jsp:forward> </body>
<body> <jsp:forward>请求转发<br> <% String name = (String) request.getAttribute("name") ; String age = (String) request.getParameter("age") ; String weight = (String) request.getParameter("weight") ; String address = (String) request.getParameter("address") ; out.write(address) ; //address = new String(address.getBytes("iso-8859-1"),"UTF-8") ; //address = URLDecoder.decode(address) ; out.write(name + ":" +age + ":" + weight + ":" + address) ; %> </body>
在JSP中操作javaBean:
使用动作元素(内置标签)
l jsp:useBean:用于从指定范围根据名称查找JavaBean,如果没有找到,创建该JavaBean的实例,然后放到指定的范围中。如果找到了,直接取出来用。
属性:
id:查找的bean的名称。
class:查找的bean的类全名
scope:指定查找的范围
默认值page,从PageContext页面范围找
可选值:
request,从ServletRequest中找,请求范围
session,从HttpSession中找,会话范围
application,从ServletContext中找,应用范围
l jsp:setProperty:给指定名称的bean的属性设置值。调用setter方法
属性:
property:对应的是JavaBean中的setter方法
name:指定那个bean
value:设置的值
param:请求参数的名称
l jsp:getProperty:把指定名称的bean的属性的值打印到页面上
如果一个属性的值为null,界面就会显示null,不爽
属性:
property:对应的是JavaBean中的setter方法
name:指定那个bean
User:
package com.heima.bean;
import java.io.Serializable;
public class User implements Serializable{
private String name ;
private String age ;
private String sex ;
private String address ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
<body> <!-- userbean标签相当于 User user = new User() ;--> <jsp:useBean id="user" class="com.heima.bean.User" ></jsp:useBean> <!-- 相当于调用set方法设置值 -->使用user对象来封装name属性,值为张无忌 <jsp:setProperty property="name" name="user" value="张无忌"/> <!-- 相当于调用get方法获取值 --> <jsp:getProperty property="name" name="user"/> </body>
<body> <form action= "/day12_00_jsp/12.jsp" method="post"> 姓名:<input type = "text" name = "name"><br> 年龄: <input type = "text" name = "age"><br> 性别:<input type = "radio" name = "sex" value = "男">男<input type = "radio" name = "sex" value = "女">女<br> 地址:<input type = "text" name = "address"> <input type = "submit" value = "提交"> </form> <a href = "/day12_00_jsp/12.jsp?name=abc&age=30">封装数据</a> <jsp:forward page="/12.jsp?name=abc"> <jsp:param value="15" name="age"/> <jsp:param value="beijing" name="address"/> </jsp:forward> </body>
<body> 用user对象封装数据: <% request.setCharacterEncoding("UTF-8"); %> <jsp:useBean id="user" class="com.heima.bean.User"></jsp:useBean> <!-- 把页面上名字叫name的控件的内容封装到user对象的name属性中 --> <jsp:setProperty property="name" name="user" param="name"/> <jsp:setProperty property="age" name="user" param="age"/> <jsp:setProperty property="sex" name="user" param="sex"/> <jsp:setProperty property="address" name="user" param="address"/> <jsp:getProperty property="name" name="user"/>: <jsp:getProperty property="age" name="user"/>: <jsp:getProperty property="sex" name="user"/>: <jsp:getProperty property="address" name="user"/><br> <hr> 采用内省机制进行封装:<br> <!-- 要求页面上控件的名字和javaBean里面的名字一一对应 --> <jsp:setProperty property="*" name="user"/> <!-- 表单里提交的控件的名字叫name,就在javabean里找有没有setName这个方法,如果有,就直接采用反射机制调用该方法进行封装 --> <jsp:getProperty property="name" name="user"/>: <jsp:getProperty property="age" name="user"/>: <jsp:getProperty property="sex" name="user"/>: <jsp:getProperty property="address" name="user"/><br> <hr> 封装超链的数据:<br> <jsp:useBean id="user1" class="com.heima.bean.User" ></jsp:useBean> <jsp:setProperty property="*" name="user1"/> <jsp:getProperty property="name" name="user1"/> <jsp:getProperty property="age" name="user1"/> <hr> 封装转发标签的数据:<br> <jsp:useBean id="user2" class="com.heima.bean.User" scope="session"></jsp:useBean> <jsp:setProperty property="*" name="user2"/> <jsp:getProperty property="name" name="user2"/> <jsp:getProperty property="age" name="user2"/> <jsp:getProperty property="address" name="user2"/> <a href = "/day12_00_jsp/13.jsp">13.jsp</a> </body>
<body> 封装转发标签的数据:<br> <% User user = (User) session.getAttribute("user2") ; out.write(user.getName() + ":" + user.getAddress() + ":" + user.getAge()) ; %> <!-- 不能直接用getProperty去拿取数据 --> </body>
相关文章推荐
- jsp概述及基本语法
- JSP 基本语法
- JSP的基本语法与简单表单处理
- JSP基本语法
- JSP基本语法(上)
- (七)JSP基本语法--session对象
- JSP基本语法
- jsp基本语法介绍
- JSP基本语法D--request对象
- (二)JSP基本语法A
- jsp基本语法
- JSP基本语法
- jsp程序设计(二)-jsp基本语法(5)-Page指令
- jsp程序设计(二)-jsp基本语法(4)-Scriptlet
- (三)JSP基本语法B
- jsp程序设计(二)-jsp基本语法(2)-声明
- jsp程序设计(二)-jsp基本语法(10)- jsp:plugin
- jsp程序设计(二)-jsp基本语法(7)- jsp:forward
- JSP概述、元素、语法、解释
- jsp的基本语法