您的位置:首页 > Web前端 > JavaScript

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: