一、JSP的访问原理:
1.jsp的概念:
JSP 全名为 Java Server Pages,中文名叫 java 服务器页面,其根本是一个简化的 Servlet 设计,它是由 Sun Microsystems 公司倡导、许多公司参与一起建立的一种动态网页技术标准。
2.特点:
(1)本质上还是 Servlet;
(2)跨平台,一次编写处处运行;
(3)组件跨平台;
(4)健壮性和安全性;
3.第一个jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'myjsp.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<h3>欢迎访问jsp页面</h3>
<br>
</body>
</html>
结果
4.jsp的访问原理:
浏览器发起请求,请求 JSP,请求被 Tomcat 服务器接收,执行JspServlet 将请求的 JSP 文件转义成为对应的 java 文件(也是Servlet),然后执行转义好的 java 文件。
-
原理图:
原理图 - 注意:
Jsp中可以书写java代码,但是java代码会被原样转译到其对应的java文件中执行。
5.
二、JSP的引入和请求转发:
1.page指令的属性及作用:
(1)Language:声明转译语言;
(2)Import:声明转译时导入的包;
(3)PageEncoding:设置jsp数据的保存编码格式;
(4)ContentType:设置数据响应的格式;
(5)Session:设置session的状态,默认为true,也就转译的servlet文件中默认session是开启,使用false关闭;
(6)isErrorPage: 默认为false,true表示开启Exception异常对象使用;
(7)errorPage:设置当jsp运行出现异常时跳转到指定页面。
- 代码示例:
<%@page language="java" %><%-- 声明转译语言 --%>
<%@page import="java.util.*" %><%-- 声明转译时导入的包 --%>
<%@page pageEncoding="utf-8" %><%--设置jsp数据的保存编码格式 --%>
<%@page contentType="text/html; charset=utf-8"%><%--设置数据的响应编码格式 --%>
<%@page session="false" %><%--设置session的状态,默认为true,也就转译的servlet文件中默认session是开启,使用false关闭 --%>
<%@page isErrorPage="true" %><%--默认为false,true表示开启Exception异常对象使用 --%>
<%@page errorPage="error.jsp" %><%--设置当jsp运行出现异常时跳转到指定页面 --%>
<%--
page指令的作用,设置jsp转译的时候的一些配置信息
--%>
<%
// int i=5/0;
%>
2.jsp中的代码块:
(1)局部代码块:<% %>;
(2)全局代码块:<%! %>;
(3)脚本段语句:<%= %>;
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--
局部代码块
声明方式:<% java代码 %>
特点:
使用局部代码块声明的java代码会被原样转译到_jspService方法中。也就是局部代码。
--%>
<%
int a=123;
System.out.println(a);
test();
%>
<%--
全局代码块
声明方式:<%! 声明全局java代码%>
特点:
全局代码块中声明的java代码,在被转译时,会转译成jsp对应的java文件的全局的代码。
作用:
声明方法和全局变量
注意:
使用全局代码块声明方法。使用局部代码块调用方法。
--%>
<%!
int b=456;
public void test(){
System.out.println("全局代码块声明!");
}
%>
<%--
java脚本段、表达式
声明方式:<%=变量名或者方法名()%>
作用:将java代码的运算结果数据或者其他数据响应给浏览器
注意:
在该表达式中不能使用分号结尾
--%>
<i><%=a %></i>
<b>jsp代码学习</b>
3.jsp中的注释:
(1)HTML注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
(2)CSS注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
(3)js注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
(4)java注释:会被转译,但不会执行。
(5)jsp注释:注释的内容不会被转译,也不会被执行。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--
jsp的注释:
HTML注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
CSS注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
js注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
java注释:会被转译,但不会执行
jsp注释:注释内容不会被转译,也不会被执行
格式:%-- 注释内容 --%
--%>
<html>
<head>
<style type="text/css">
/*css注释*/
</style>
<script type="text/javascript">
//js注释
</script>
</head>
<%
//java注释
int b=456;
%>
<body>
<!-- html注释 -->
<b>HTML注释</b>
</body>
</html>
4.jsp中的静态引入和动态引入:
(1)静态引入:<%@include file=“要引入的资源的相对路径”%>;
(2)动态引入:<jsp:include page=” 要引入的资源的相对路径”></jsp:include>;
- 二者的区别:
静态引入被引入的jsp文件被转译为一个java文件使用;动态引入被引入的文件会被单独转译,原有的jsp文件会调用被引入的jsp文件。
- 代码示例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--
问题:
发现,不同的jsp页面会使用相同的资源。如果将资源在每个jsp页面都单独声明
则会造成代码的冗余量过高,不易于代码的维护和升级。
解决:
使用静态引入和动态引入的方式
使用:
静态引入:
<%@include file="要引入的资源的相对路径"%>
特点:
被引入的jsp文件和原有jsp文件被转译成一个java文件使用。
注意:静态引入的相关jsp文件中不能声明同名变量。
动态引入:
<jsp:include page="static.jsp"></jsp:include>
特点:
被引入的文件会被单独转译,原有jsp文件会调用被引入的jsp文件。
注意:动态引入的相关jsp文件中可以声明同名变量。
作用:
实现了不同jsp之间的资源共享。
--%>
<html>
<head></head>
<body>
<h4>静态引入和动态引入的学习</h4>
<hr>
<%-- <i>©网站声明,手机号:12434535,网站备案号等</i>--%>
<%int a=3; %>
<!-- 静态引入 -->
<%-- <%@include file="static.jsp" %> --%>
<!-- 动态引入 -->
<jsp:include page="static.jsp"></jsp:include>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<i>©网站声明,手机号:12434535,网站备案号等</i>
<% int b=2; %>
结果
5.jsp中的forward标签:
解决不同的jsp在处理请求时,有可能会将当前的请求转发给另外的jsp进行处理的问题;实现jsp之间的请求转发。
- 注意:
forward标签中除了<jsp:param value="" name=""/>子标签以外不能出现其他内容,否则会报错。
- 代码示例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--
jsp之间的资源转发:
问题:
不同的jsp在处理请求时,有可能会将当前的请求转发给另外的jsp进行处理。
解决:
使用forward动作指令
使用:
<jsp:forward page="要转发的jsp的相对路径"></jsp:forward>
特点:
从当前jsp跳转另外一个jsp页面。
注意:
forward标签中除了<jsp:param value="" name=""/>子标签以外不能出现其他内容,否则会报错。
--%>
<html>
<head>
</head>
<body>
<h3>forward转发标签</h3>
<hr >
<%
int a=2;
if(a>3){
%>
<b>欢迎访问</b>
<%
}else{
%>
<jsp:forward page="commen.jsp">
<jsp:param value="zhangsan" name="uname"/>
</jsp:forward>
<%
}
%>
</body>
</html>
- 跳转的页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head> </head>
<body>
<b>你的请求被屏蔽了,请及时续费</b>
</body>
</html>
结果
三、JSP的内置对象:
1.九个内置对象:
(1)request对象(HttpServletRequest):封装用户请求数据,通过该对象可以获取用户请求的相关数据。
常用的方法:
1)request.getParameter(String name)--->String: 根据参数的名称获取参数的值。
2)request.getParameterValues(String name)--->String[]:根据参数的名称获取参数的值主要用于复选框。
3)request.setAttribute(String name,Object value):将指定的值存到request范围中.
4)request.getAttribute(String name):通过名称从request返回中获取值。
5)request.getRequestDispatcher(String url).forward(request,response):请求转发
6)request.setCharacterEncoding(String encoding):设置请求编码集,可以解决post提交的乱码问题。
7)request.getSession():获取会话对象。
需要了解的方法
request.getScheme():获取协议 --->http
request.getServerName():获取服务器名称或IP地址
request.getServerPort():获取服务器端口号
request.getContextPath():获取上下文路径(默认是项目名)
(2)response对象(HttpServletResponse):封装响应数据。
常用的方法:
1)response.setContentType(String content);用法:response.setContentType("text/html;charset=utf-8");
2)response.sendRedirect(String url):重定向
3)response.getWriter()--->JspWriter:获取输出流进行输出
(3)session对象(HttpSession):封装会话信息(浏览器和服务器之间的会话),一个会话中多次请求数据共享。
常用的方法:
1)session.setAttribute(String name,Object value):存值
2)session.getAttribute(String name):取值
3)session.invalidate():销毁会话
(4)application对象(ServletContext):封装Servlet上下文信息,整个应用程序共享。
常用的方法:
1)application.setAttribute(String name,Object value):存值
2)application.getAttribute(String name):取值
(5)out对象(PrintWriter):在页面输出信息
out.print(Object content)/out.println(Object content);
out.write(Object content)
(6)pageContext对象:页面上下文对象,可以通过该对象获取其他8个内置对象
pageContext.setAttribute(String name,Object value):存值
pageContext.getAttribute(String name):取值
(7)page对象(this):当前页面
(8)config对象(ServletConfig):封装配置信息
(9)exception(Exception):封装异常信息
2.jsp中四个作用域对象:
(1)page:作用域范围仅限于当前页面。
(2)request:作用域范围仅限于一次请求之间(包含当前页面)。注意:如果在A页面存值,在B页面取值,则A页面跳转B页面必须使用请求转发。
(3)session:作用域范围仅限于一次会话之间(包含当前页面和多次用户请求)。
(4)application:作用域范围是整个应用程序(项目)共享。
(5)其范围大小:application>session>request>page;
3.jsp和Servlet的职责:
JSP 负责页面展现,Servlet 负责业务逻辑处理。
四、JSP的相对路径和绝对路径:
1.Servlet中请求转发和重定向的绝对路径:
- 为什么写成绝对路径:
写成绝对路径可以解决相对路径造成的文件路径发生变更后,从当前路径找不到资源的相对路径问题。
- 代码示例:
package com.zlw.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet重定向jsp
* response.sendRedirect("jsp的相对路径/servlet的别名");//重定向jsp页面
* Servlet请求转发jsp
* request.getRequestDispatcher("jsp的相对路径/servlet的别名").forward(req, resp);//请求转发到jsp页面
* 服务器根目录 服务器的webapps目录路径 localhost:8080/
* 项目根目录 服务器的webapps目录下项目路径 localhost:8080/jsp/
* 注意:
* 以上两种写法其实都是相对路径,相对路径指的是从当前请求路径查找jsp所经过的路径。
* 请求转发和重定向的绝对路径写法总结:
* 重定向:
* 在重定向中的路径中第一个/表示服务器根目录。
* 示例:
* response.sendRedirect("/虚拟项目名/资源路径");//重定向jsp页面
* 请求转发:
* 在请求转发中第一个/表示项目根目录
* 示例:
* request.getRequestDispatcher("/资源路径").forward(req, resp);//请求转发到jsp页面
* @author zhang
*
*/
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求编码格式
request.setCharacterEncoding("utf-8");
//设置响应编码格式
response.setContentType("text/html;charset=utf-8");
//获取请求信息
String str = request.getParameter("chice");
//处理请求信息
if ("main".equals(str)) {
//响应
// response.sendRedirect("user/main.jsp");//重定向
// request.getRequestDispatcher("user/main.jsp").forward(request, response);//请求转发
// response.sendRedirect("/jsp/user/main.jsp");//重定向,绝对路径
request.getRequestDispatcher("/user/main.jsp").forward(request, response);//请求转发的绝对路径
}
//处理响应结果
}
}
- 项目文件夹user下的main.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'main.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h3>欢迎访问</h3>
<hr>
</body>
</html>
结果
2.jsp中的绝对路径和basePath:
- 问题:
在jsp页面中进行资源之间的跳转时,如果书写的是相对路径,这样会造成如果当前文件的路径发生变更,从当前路径查找资源的相对路径都要重新进行书写。
- 解决:
将相对路径编写为绝对路径;
示例:<a href="/虚拟项目名/资源路径">访问关键字</a>;
- 注意:
在Myeclipse中创建的jsp页面会自动生成路径处理代码basePath,而basePath的值为当前项目根目录,并且在head标签中使用了<base href="<%=basePath%>">,相当于将当前页面的资源全部默认定位为从项目根目录开始查找,我们就不需要写第一个“/”了。
basePath方式和添加/方法只能二选一。
“..”:表示返回上一级目录。
- 代码示例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'path.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<%--
问题:
在jsp页面中进行资源之间的跳转时,如果书写的是相对路径
这样会造成如果当前文件的路径发生变更,从当前路径查找资源的相对路径
都要重新进行书写。
解决:
将相对路径编程绝对路径
使用:
在jsp中路径中的第一个/表示服务器根目录。
示例:
<a href="/虚拟项目名/资源路径">访问关键字</a>
注意:
在Myeclipse中创建的jsp页面会自动生成路径处理代码basePath
而basePath的值为当前项目根目录,并且在head标签中使用了<base href="<%=basePath%>">
相当于将当前页面的资源全部默认定位为从项目根目录开始查找,我们就不需要写第一个/了
注意:
basePath方式和添加/方法只能二选一。
--%>
</head>
<body>
这是path.jsp
<br>
<a href="a/a.jsp">a.jsp</a>
</body>
</html>
- WebRoot下a目录下的a.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'a.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
这是a.jsp
<a href="b/b.jsp">b.jsp</a>
<!-- 相对路径-->
<!--<a href="../path.jsp">path.jsp</a>-->
<!-- 绝对路径-->
<a href="/jsp/path.jsp">path.jsp</a>
</body>
</html>
- WebRoot下a目录下的b目录下b.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'b.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
这是b.jsp
<!-- 相对路径-->
<!-- <a href="../a.jsp">a.jsp</a>
<a href="../../path.jsp">path.jsp</a>-->
<!-- 绝对路径-->
<a href="/jsp/a/a.jsp">a.jsp</a>
<a href="/jsp/path.jsp">path.jsp</a>
</body>
</html>
path.jsp
a.jsp
b.jsp
网友评论