一、引言
使用Servlet处理浏览器发起的请求,并将响应结果返回给浏览器。那么使用Servlet进行页面的展现,代码书写过于麻烦。极大的影响了开发的效率,那么有没有一种方式可以让我们像以前写网页一样来进行网页的变成工作呢?
可以使用JSP技术!!!
使用Servlet进行页面的展现:
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<font color='red'>"+str+"</font>");
resp.getWriter().write("<form method='get' action='login'>");
resp.getWriter().write("账号:<input type='text' name='uname'/>");
resp.getWriter().write("密码:<input type='password' name='pwd'/>");
resp.getWriter().write("<input type='submit' value='Login'/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
二、JSP简介
简介:
JSP全名为Java Serve Page,中文名为Java服务器页面,其根本是一个简化的Servlet设计,它是由Sun公司倡导,许多公司参与一起建立的一种动态网页技术标准。
特点:
- 其本质还是Servlet
- 跨平台,一次编写处处运行
- 组件跨平台
- 健壮性和安全性
JSP原理:
浏览器发起请求,请求JSP页面,请求被Tomcat服务器接收,执行JspServlet将请求的JSP文件转译成为对应的Java文件(也是Servlet),然后执行转移好的Java文件。
通俗理解:浏览器向服务器请求JSP页面,服务器接收到该请求后,调用内部的JspServlet,将该JSP页面转译为相应的Servlet,随后服务器执行该转译后的Servlet,并将执行结果响应给浏览器。
转译过程中,JspServlet根据不同语言的标记进行转译,其中前端语言使用resp.getWriter.write("......");转译,并最终响应给浏览器,让浏览器解释执行。而Java语言直接转译为Java语句,在转译后的Servlet中被执行。
(JSP的目的是简化响应页面的开发,但是Tomcat服务器不认识JSP,只能将JSP转译成相应的Servlet并执行)
三、JSP语法规则
JSP的三种注释
- 前端语言注释:会被转译,也会发送给浏览器,但是不会被浏览器执行。
- Java语言注释:会被转译,但是不会被Servlet执行
- JSP注释:不会被转译
JSP的page指令
存在于JSP页面最上端,其作用是配置JSP文件的转译相关参数。
书写格式如下:
<%@ page 属性名="属性值" 属性名="属性值" 属性名="属性值" %>
例子:(可以书写在一条page指令里,也可以分别书写多条page指令)
<%@ page import="db.DBCity" %>
<%@ page language="java" contentType="text/html; charset=gb18030" pageEncoding="gb18030"%>
属性说明:
- language:声明JSP要被转移的语言。
- import:声明转译的Java文件要导入的包,不同的包使用逗号隔开。
- pageEncoding:设置JSP文件的数据编码格式。
- contentType:设置JSP数据响应给浏览器时,浏览器的解析和编码格式。
- session:设置转译的Servlet中是否开启session支持,默认是开启,true表示开启,false表示关闭。
- errorPage:设置JSP运行错误跳转的页面。
- extends:设置JSP转移后的Java文件(Servlet)要继承的父类(包名+类名)。
JSP的局部代码块(转译后在Servlet的service方法中)
特点:局部代码块中声明的Java代码会被原样转译到JSP对应的Servlet文件的_JspService方法中。(相当于Servlet中的service方法)
书写格式如下:
<% Java代码 %>
例子:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>JSP练习</title>
<meta charset="utf-8"/>
</head>
<body>
<h3>JSP基本语法学习</h3>
<hr/>
<%
int a=2;
if(a>3){
%>
<b>JSP学习很简单</br>
<%
}else{
%>
<i>JSP中使用逻辑校验很麻烦</i>
<%
}
%>
</body>
</html>
缺点:使用局部代码块在JSP中进行逻辑判断,书写麻烦,阅读困难。
注意:开发中尽量使用Servlet进行请求逻辑处理,使用JSP进行页面展现。
JSP的全局代码块(转译后在Servlet的service方法外,是全局的)
特点:声明的Java代码作为全局代码转译到相应的Servlet类中。
书写格式如下:
<%! Java代码 %>
例子:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>JSP练习</title>
<meta charset="utf-8"/>
</head>
<body>
<h3>JSP基本语法学习</h3>
<hr/>
//局部代码块
<%
int a=2;
if(a>3){
%>
<b>JSP学习很简单</br>
<%
}else{
%>
<i>JSP中使用逻辑校验很麻烦</i>
<%
}
%>
//全局代码块
<%!
int b=5;
public int test(){
System.out.println("hello,world");
return 1;
}
%>
</body>
</html>
注意:全局代码块声明的代码,需要使用局部代码块调用。
JSP的脚本段语句
特点:帮助我们快速的获取变量或者方法的返回值作为数据相应给浏览器。
书写格式如下:
<%=变量名或者方法 %>
例子:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>JSP练习</title>
<meta charset="utf-8"/>
</head>
<body>
<h3>JSP基本语法学习</h3>
<hr/>
//局部代码块
<%
int a=2;
String str="你真好!!!";
if(a>3){
%>
<b>JSP学习很简单</br>
<%
}else{
%>
<i><%=str%></i>
<i><%=test()%></i>
<%
}
%>
//全局代码块
<%!
int b=5;
public void test(){
System.out.println("hello,world");
}
%>
</body>
</html>
注意:不要在变量名或者方法后面使用分号。
JSP的静态引入(include指令)
JSP页面中引入其他JSP页面的内容,降低代码的冗余,方便维护。
书写格式:
<%@include file="要引入的JSP文件的相对路径"%>
特点:会将引入的JSP文件和当前的JSP文件转译成为一个Java(Servlet)文件使用,最后在网页中显示合并后的显示效果。
注意:
- 静态引入的JSP文件不会单独转译为Java(Servlet)文件。
- 当前JSP文件和静态引入的JSP文件中不能使用Java代码块声明同名变量。(当前JSP文件和静态引入的JSP文件会转译为同一个Servlet文件,在该Servlet文件中出现同名变量是不允许的)
JSP的动态引入
JSP页面中引入其他JSP页面的内容,降低代码的冗余,方便维护。
书写格式:
<jsp:include page="要引入的JSP文件的相对路径"></jsp:include>
特点:会将引入的JSP文件单独转译,在当前文件转译好的Java(Servlet)文件中调用引入的JSP文件的转译文件。
注意:
- 动态引入允许文件中声明同名变量(当前JSP文件转译为一个Servlet文件,动态引入的JSP也会转译为一个Servlet文件,所以,当前JSP文件动态引入另一个JSP文件,相当于在当前Servlet文件中调用另一个Servlet文件中的方法或变量)
静态引入与动态引入的区别:
JSP的forward转发标签
书写格式:
<jsp:forward page="要转发的JSP文件的相对路径"></jsp:forward>
特点:一次请求;地址栏信息不改变
注意:
在转发标签的两个标签中间除了写<jsp:param value="str" name="aaa"/>子标签不会报错,其他任意字符都会报错。
即,使用forward标签进行转发的时候,可以添加额外的键值对信息。
<jsp:param value="str" name="aaa"/>中name属性为附带信息的键名,value属性为附带信息的值名。该键值对信息类似于get请求的数据提交方式(以?的形式拼接在路径的后面),因此使用request.getParameter()方法取数据。
例子:浏览器访问JSP主页面,JSP主页面使用forward标签转发给另一个JSP页面,并且添加了额外的键值对信息。另一个JSP页面在显示的时候,获取该额外的键值对信息,并显示在浏览器中。
原理:
JSP主页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<title>主页面</title>
</head>
<body>
<h1>转发标签的学习</h1>
<jsp:forward page="forward.jsp">
<jsp:param value="marden" name="str"/>
</jsp:forward>
</body>
</html>
JSP转发页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<title>转发页面</title>
</head>
<body>
<i>这是转发页面啦</i>
<h1><%=request.getParameter("str") %></h1>
</body>
</html>
显示结果:
四、JSP的九大内置对象
JSP文件在转译成其对应的Servlet文件的时候,自动生成并声明的对象(声明在service方法中),我们在JSP页面中直接使用即可。
注意:内置对象在JSP页面中使用的时候,只能在局部代码块和脚本段语句中使用,不能再全局代码块中使用。
九个内置对象:
- pageContext:页面上下文对象,封存了其他内置对象。每个JSP文件单独拥有一个pageContext对象。其作用域是当前页面。
- request:封存当前请求数据的对象,由tomcat服务器创建。其作用域是一次请求。
- session:该对象用来存储用户不同请求的共享数据。其作用域是一次会话。
- application:也就是ServletContext对象,每个项目只有一个,用来存储不同用户的共享数据,其作用域是一个项目。
- response:用来响应请求处理结果给浏览器的对象。可以设置响应头,重定向。
- out:也是一个响应对象,在JSP内部使用,带有缓冲区的响应对象,效率高于response对象。
- page:代表当前JSP对象,相当于Java中的this关键字。
- exception:异常对象,存储了当前运行的异常信息。使用此对象,需要在page指令中,使用属性isErrorPage="true"开启。
- config:也就是ServletConfig对象,主要用来获取web.xml中的配置信息,完成一些初始化数据的读取。
五、三个作用域对象
- request:作用域为一次请求,用于一次请求的Servlet的数据共享。通过请求转发,将数据流转给下一个Servlet。
- session:作用域为一次会话,用于一个用户的不同请求的数据共享。通过session,将数据流转给其他请求。
- application:即Servlet中的ServletContext对象。作用域为整个项目内,用于不同用户的数据共享。通过application,将数据从一个用户流转给其他用户。
作用:数据流转
六、JSP的资源路径
(1)使用相对路径
有如下问题:
问题一:资源的位置不可随意更改
问题二:需要使用../进行文件夹的跳出,使用起来较为麻烦
(2)使用绝对路径(必须掌握)
格式为:/虚拟项目名/项目资源路径
例如:
<a href="/jsp/a.jsp">a.jsp</a>
<a href="/jsp/a/a.jsp">a.jsp</a>
注意:在JSP中资源的第一个/表示的是服务器根目录,即tomcat服务器的webapps文件夹,相当于:localhost:8080
(3)使用JSP中自带的全局路径声明
书写格式:(Myeclipse中JSP文件自带,Eclipse中没有)
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">
作用:给资源前面添加项目路径(即自动生成了绝对路径的前面部分,包括ip地址,端口号,虚拟项目名。使用的时候只需要写在虚拟项目名后面的资源路径即可)