常用配置项解析
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
-
<% String path = request.getContextPath();%>jsp里面用到意思是:
1.request.getContextPath() 获得当前的项目根目录路径;
2.声明一个字符串变量path;
3.将当前项目的根目录复制给变量path。
-
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
获得应用的根url,比如说你的应用的根路径是 http://localhost:8080,那么你列出的代码就是为basePath赋值为 http://localhost:8080。
-
具体点:
1、request.getScheme() 返回协议的名称 http,和后面的"://" 拼起来就成了 http://
2、request.getServerName() 这是获取你的服务器的名称,如果你的应用部署在本机那么其就返回localhost或者127.0.0.1 ,这2个是等价的
3、request.getServerPort() 是你应用使用的端口,比如8080或者80
只用在修改类和配置文件时才需要重新部署
JSP原理
由于原理上是Servlet, 所以JSP/Servlet在一起。
HTML、Servlet和JSP
1、HTML:静态页面,不能包含java代码,只能有HTML有关的标记
2、Servlet:写java代码,做页面的输出,不是很方便(开发效率很低)
3、JSP:HTML+java
学习JSP技巧
1、JSP就是Servlet,学习好JSP的关键(语法),时刻想到他对应的Servlet。
2、时常翻阅JSP对应的Servlet源码(到tomcat下查看jsp相对应的*.java文件)
JSP的语法
模板元素
指JSP中的那些HTML。开发时先编写模板元素,因为他们决定页面的外观。
Java程序片段
语法:<%java程序%>
出现在JSP对应Servlet的service方法中。
<%声明的变量:局部%>
Java表达式
语法:<%=表达式%>
示例
<!-- 以表格的形式打印出来 -->
<table border = "1" width = "438">
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<%
for(student s : stu){
%>
<tr>
<td><%=s.getName()%></td>
<td><%=s.getGender()%></td>
<td><%=s.getAge()%></td>
</tr>
<%
}
%>
JSP声明
语法:<%!
%>
作用:定义JSP对应Serlvet的成员(变量和方法、静态方法)全局变量
注意:开发中很少用。面试和考试经常考。
JSP注释
语法:<%--这是注释--%>
作用:注释掉的代码,JSP引擎不会翻译到Servlet源码中。要注意和HTML注释的区别。
JSP指令:
指令是为JSP引擎设计的。而只是告诉引擎如何处理JSP页面中的其余部分(非指令部分);
基本语法格式:<%@指令 属性1=”值1” ....%>.一般把指令放在JSP页面的顶部(不是必须的)
指令的属性可以写在一个指令的中,也可以分开写:比如:
<%@指令 属性1=”值1” 属性2=”值2”%>.等价于:
<%@指令 属性1=”值1” %>.<%@指令 属性2=”值2”%>.
page:
属性:
language:告知引擎,脚本用的是java。默认java,支持java。不写也行。
extends:告知引擎,JSP对应的Servlet的父类是哪个。不需要写,也不要改。
*import:告知引擎,导入哪些包。
注意:引擎自动导入: java.lang.;javax.servlet.;javax.servlet.http.;javax.servlet.jsp.;
导入的形式:
<%@page import=”java.util.Date,java.util.UUID”%>或者: <%@page
import=”java.util.Date”%> <%@page import=”java.util.UUID”%>用Eclipse:Alt+/ 自动导入
*session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认值true。 buffer:JspWriter用于输出JSP的内容到页面上。告知引擎,设定他的缓存大小。默认8Kb。
*errorPage:告知引擎,当前页面出现了异常,应该转发到哪个页面上(路径写法:/代表着当前应用,相对路径)
配置全局错误页面:web.xml
-
isErrorPage:告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception隐含对象,打印异常的详细信息。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%> <body> <%=exception.getMessage() %> <h1>服务器出错了</h1> <h1>服务器出错了</h1> <h1>服务器出错了</h1> <h1>服务器出错了</h1> <h1>服务器出错了</h1> <h1>服务器出错了</h1> <h1>服务器出错了</h1> <h1>服务器出错了</h1> <h1>服务器出错了</h1> </body>
contentType:告知引擎,响应正文的MIME类型。
contentType=”text/html;charset=UTF-8” 相当于response.setContentType(“<%=exception.getMessage() %>”);pageEncoding:告知引擎,翻译JSP时(要从磁盘上读JSP文件)所用的码表。要和存的时候编码一致
pageEncoding=”UTF-8”:相当于,告知了引擎用UTF-8读jsp,还response.setContentType(“text/html;charset=UTF-8”);
isELIgnored:告知引擎,是否忽略EL表达式。默认值是false,不忽略。
include:
包含属性:file,以”/”开头,就代表着当前应用。
taglib:
引入外部的标签。实现视图代码重用,很少量的代码就能实现很复杂的效果
要使用标签功能必须先声明标签库以及标签前缀
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>uri:外部的标签的uri地址,好比名称空间
prefix:前缀。
JSP中的转发和包含
1、转发:<jsp:forward page="/10forward.jsp"></jsp:forward>
<jsp:forward page="/10forward.jsp">
<jsp:params value="124" name="username"
</jsp:forward>
forward不仅可以跳转到本应用的另一个servlet jsp页面,也可以跳转到另外一个文件,甚至WEB-INF文件夹下的文件
当使用forward进行跳转时, 地址栏会显示跳转前的访问地址,跳转是在服务器端实现的
重定向是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码
进行重定向时,跳转是在客户端实现的。也就是客户端实际上请求了服务器两次。第一次获得重定向状态码和重定向的网址,第二次访问真实网址,
JSP的内置标签。
2、参数:不能单独使用
向目标传递请求参数-
3、包含:(面试题)
静态包含:<%@include %> 在编译的时候,将源码加了进去
动态包含:其余的
<jsp:include page=””/>
总结:用标签可以少些java脚本。
JSP九个隐含对象
PageContext抽象类(很重要)每个页面都有自己唯一的pageContext对象
-
1、本身是一个域(范围)对象,还能操作其他3个域对象中的属性
页面范围:
void setAttribute(String name,Object value);
void removeAttribute(String name);
Object getAttribute(String name);操作其他域对象中的属性:
void setAttribute(String name,Object value,int scope);
void removeAttribute(String name,int scope);
Object getAttribute(String name,int scope);int scope:常量,PageContext PAGE_SCOPE(页面) REQUEST_SCOPE(请求)SESSION_SCOPE(会话)APPLICATION_SCOPE(应用)
在四个范围中依次查找指定名称对象的方法:
PAGE(页面) REQUEST(请求)SESSION(会话)APPLICATION(应用)-
超出页面范围结果为null,如果是同一个对象,那么就会输出value值。
Object findAttribute(String name); 从四个对象中依次查找
-
2、获取其他八个JSP隐含对象(自定义标签时用)
PageContext.getRequest();
getServletContext();
getServletConfig();
getException();
get... -
3、提供转发和包含的简易方法
pageContext.include(String url);
参数必须以“/”开始,“/”表示本web应用程序的根目录(WebRoot)
pageContext demo
<%@ 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>pageContext demo</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>
<% pageContext.setAttribute("p", "pp"); %>
<% pageContext.setAttribute("p", "pp", pageContext.PAGE_SCOPE); %>
<% request.setAttribute("p", "rp"); %>
<% pageContext.setAttribute("p", "rp", pageContext.REQUEST_SCOPE); %>
<% session.setAttribute("p", "sp"); %>
<% pageContext.setAttribute("p", "sp", pageContext.SESSION_SCOPE); %>
<% application.setAttribute("p", "ap"); %>
<% pageContext.setAttribute("p", "ap", pageContext.APPLICATION_SCOPE); %>
<%--
<jsp:forward page = "2.jsp"></jsp:forward>
--%>
<%--
response.sendRedirect("2.jsp");
--%>
<%
pageContext.forward("/test/2.jsp");
%>
<%--
<%=pageContext.getAttribute("p")%>
<%=request.getAttribute("p")%>
<%=session.getAttribute("p")%> --%>
</body>
</html>
<%@ 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>2</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>
page:<%=pageContext.getAttribute("p")%></br>
request:<%=request.getAttribute("p")%></br>
session:<%=session.getAttribute("p")%></br>
application:<%=application.getAttribute("p")%></br>
</body>
</html>
四大域对象
实际开发中:存放数据的。
PageContext:页面范围。最小。开发中很少用。演示代码。
ServletRequest:请求范围。不同的资源,只有用转发。
HttpSession:会话范围。多次请求共享数据,但不同的客户端不能共享。
ServletContext:应用范围。最大。尽量少用。用时要做同步处理。
JSP开发的最佳实践
Servlet:擅长写Java代码逻辑,不擅长输出html的内容。
开发中作为:控制器。
JSP:不擅长写Java代码逻辑,擅长显示结果。
开发中作为:视图(显示结果)
JavaBean的概念
1、JavaBean又称之为POJO(Plain Old Java Object)、VO(Value Object)、DO(Data Object)
-
2、JavaBean的书写规范
a、必须是public的
b、提供默认的构造方法
c、字段都是私有的: private String username;
d、提供公有的getter或setter方法:属性。
getUsername():读属性,属性名:username.
setUsername(String username):写属性,属性名:username。
注意:private boolean married; getMarried()===isMarried()
e、一般需要实现java.io.Serializable接口。
结论:JavaBean在JavaEE开发中,主要担当封装数据用的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。