- JDK(Java Development Kit)为java程序开发提供了编译和运行环境,使用JDK可以将java程序编译成字节码文件(.class文件)。
JDK有三个版本:
- J2SE标准版,主要用于开发桌面应用程序
- J2EE企业版,主要用来开发企业级应用,如电子商务网站、ERP系统
- J2ME微缩版,主要用来开发移动设备、嵌入式设备上的java应用
JDK安装后包括的几个主要文件夹介绍如下:
- bin:开发工具,包含了开发、执行、调试Java程序所用的工具和实用程序以及开发工具所需要的类库和支持文件。
- jre:实现了java运行环境。包含java虚拟机(JVM)、java核心类库和支持文件。如果只要运行java程序,则只需按照jre。如果要开发java程序,则需要jdk的支持。
- include:头文件,它支持使用java本地接口和java虚拟机调试接口的本地代码编程。
- src:构成java核心api的所有类的源文件,包含了java.*、javax.*和某些org.*包中类的源文件,不包含com.sun.*包中类的源文件。
JDK安装成功后需要配置三个环境变量:JAVA_HOME、CLASSPATH、PATH(不区分大小写),其中后两个是必须配置的,JAVA_HOME可选配置。
PATH环境变量的值就是一个可执行文件路径的列表,提供系统寻找和执行应用程序的路径。
CLASSPATH环境变量指定了java程序编译或运行时所用到的类的搜索列表。
-
用户变量和系统变量的区别:用户变量支队当前的系统登录用户可用,系统变量对所有用户可用。
-
JDBC(Java Database Connectivity)是java程序与数据库系统通信的标准api,它包含一组用java语言编写的类和接口。开发人员只需使用JDBC编写一个通用程序就可以向不同的数据库发送SQL调用。
关键语句示例:
- 加载相应的数据库驱动程序
Class.forName(“com.mysql.jdbc.Driver”); //mysql示例
- 定义要连接的数据库地址
String mysqlURL=“jdbc:mysql://host:port/dbName”; //dbName-数据库名
- 使用适当的驱动程序类建立与数据库的连接
Connection conn=DriverManager.getConnection(URL, “数据库用户名”, “密码”);
- 创建语句对象
Statement stmt=conn.createStatement();
或
PreparedStatement psm=conn.preparedStatement(“INSERT INTO tableName(column1, column2) VALUES(?,?)”);
- 执行语句
String sql=“SELECT * FROM tableName LIMIT 1”; // 还可以执行INSERT、UPDATE、DELETE等其他sql语句
ResultSet rs=stmt.executeQuery(sql);
- 对返回的结果集对象进行处理
while(rs.next){ System.out.println(rs.getString(1)+" "+rs.getString(2)); }
- 关闭连接,释放资源
rs.close();
stmt.close();
conn.close();
-
JSP运行机制
图中Servlet实例是常驻内存的,所以响应速度非常快。 -
JSP指令:
- page:页面指令,用来定义JSP页面的全局属性,该配置会作用于整个JSP页面。page指令用来指定所使用的脚本语言、导入指定的类及软件包。page指令的13个属性:language、extends、import、session、buffer、autoFlush、isThreadSafe、info、ErrorPage、isErrorPage、contentType、pageEncoding、isElIgnored。
page指令对整个页面有效,与代码位置无关,但习惯上写在JSP页面顶部。
示例:
<%@ page contentType=“text/html;charset=GB2312” import=“java.util.*” %>
- include:文件加载指令,用于在JSP文件中插入一个包含文本或代码的文件。他把文件插入后与原来的JSP文件合并成一个新的JSP页面。如果被插入的文件发生了变化,则包含这个文件的JSP页面需要被重新编译。
示例:
<%@ include file=“文件路径”%>
- taglib:标签库指令,用来引用标签库并设置标签库前缀。这个指令允许JSP页面使用用户自定义的标签,也可以为标签库命名,标签在这个库中定义。
示例:
<%@ taglib uri="tagLibraryURI” prefix=“tagPrefix”%>
- JSP脚本元素
- JSP声明语句
示例:
<%! 变量或表达式%>
- JSP表达式
示例:
<%=表达式%> // <%和=之间没有空格
- JSP Scriptlets,Scriptlet是包含dao在<% %>之间的Java代码bai,在Web容器处理JSP页面时执行du,通常会产生输出zhi,并dao将输出发送到客户的输出流里。<% %>中除了不能定义类和方法、不能用import引入类外,可以包含任何有效的Java代码。JSP Scriptlets中声明的变量是JSP页面的局部变量,调用结束后内存中间被释放。
示例:
<% java代码%>
- JSP动作元素
- jsp:include,可以在JSP文件中包含其他文件。
jsp:include与include指令的区别:如果被包含的也是 JSP文件,使用jsp:include动作元素的情况下编译器会先编译执行该文件,使用include指令时该文件不会被编译器执行,只是包含了该文件的JSP页面被编译器执行。
示例:
<jsp:include page=“relative URL” flush=“true|false”></jsp:include>
- jsp:forward,用于停止当前JSP页面的执行(后面的代码不被执行)而重定向到另一个JSP页面。jsp:forward属于服务器跳转,地址栏不会改变。
示例:
<jsp:forward page=“转向页面的URL地址” />
- jsp:param,提供参数的附属。
- 与jsp:include一起使用:
<jsp:include page=“include URL”>
<jsp:param name=“paramName” value=“paramValue”>
</jsp:include>- 与jsp:forward一起使用:
<jsp:forward page=“forward URL”>
<jsp:param name=“paramName” value=“paramValue”>
</jsp:forward> - jsp:plugin,可以将服务器端的JavaBean或Applet下载到客户端执行。
示例:
<jsp:plugin
type="bean|applet" code="ClassFi1eName"
codebase="classFileDirectoryName"
[name="instanceName"]
[archive="URIToArchive,..."]
[align="bottom|top|middle|left|right"]
[height="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPixels"]
[jreversion="JREVersionNumber|1.1"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"] >
[<jsp:params>
<jsp:param name="parameterName"
value="{parameterValue|<%=expression %>" />
</jsp:params>]
[<jsp:fallback>text message for user</jsp:fallback>]
</jsp:plugin>
- jsp:useBean,用来装载一个将在JSP页面中使用的JavaBean。这个功能非常有用,充分发挥了java组件重用的优势,同时也提高了JSP使用的方便性。需要配合使用jsp:setProperty或jsp:getProperty。
示例:
<jsp:useBean id=“beanInstanceName” class=“className” scope=“page|request|session|application”/>
- jsp:setProperty,设置或修改Bean中的属性值。
示例:
<jsp:setProperty name=“beanInstanceName” property=“propertyName” value=“propertyvalue”/
property=“propertyName” param=“parameterName”/
property=“propertyName”/
property="*"
/>
- jsp:getProperty,获取Bean中的属性值。
示例:
<jsp:getProperty name=“beanInstanceName” property=“propertyName” />
JavaBean完整示例:
<jsp:useBean id="myUsers" class="com.po.Users" scope="page" />
<h1> setProperty动作元素 </h1>
<!--根据表单自动匹配所有的属性 -->
<%--
<jsp:setProperty name="myUsers" property="*"/>
--%>
<!--根据表单匹配所有部分的属性 -->
<%--
<jsp:setProperty name="myUsers" property="username"/>
--%>
<!--根表单无关,通过手工赋值给属性 -->
<%--
<jsp:setProperty name="myUsers" property="username" value="lisi"/>
<jsp:setProperty name="myUsers" property="password" value="888888"/>
--%>
<!--通过URL传参数给属性赋值 -->
<jsp:setProperty name="myUsers" property="username" />
<jsp:setProperty name="myUsers" property="password" param="mypass" />
<!-- 使用传统的表达式方式来获取用户名和密码 -->
<%--
用户名:<%=myUsers.getUsername() %>
密码:<%=myUsers.getPassword() %>
--%>
<!-- 使用getProperty方式来获取用户名和密码 -->
用户名: <jsp:getProperty name="myUsers" property="username" />
密码: <jsp:getProperty name="myUsers" property="password" />
上面jsp:setProperty和jsp:getProperty中的name对应jsp:useBean中的id
- JSP内置对象
内置对象 | 类型 | 作用域 | 说明 |
---|---|---|---|
request | javax.servlet.http.HttpServletRequest | request | 用于获取客户端的信息 |
response | javax.servlet.http.HttpServletResponse | response | 向客户端传送输出信息 |
pageContext | javax.servlet.jsp.PageContext | page | 可以用来设置page范围的属性,还可以设置其他范围属性,不过需要指定范围参数,同时还可以获取其他内置对象。 |
session | javax.servlet.http.HtpSession | session | 记录每个客户端的访问状态 |
application | javax.servlet.jsp.ServletContext | application | 用于获取和设置Servlet相关信息 |
out | javax.servlet.jsp.JspWriter | page | 向客户端输出信息 |
config | javax.servlet.ServletConfig | page | 可以用来获取Servlet的配置信息。 |
page | java.lang.Object | page | page对象代表JSP转译后的Servlet,通过page对象可以非常方便地调用Servlet类中定义的方法。 |
exception | java.lang.Throwable | page | 用来处理错误异常,如果要用exception对象,必须指定page中的isErrorPage属性值为true。 |
- 属性保存范围
在JSP中可以通过setAttribute()和getAttribute()这两个方法来设置和取得属性。从而实现数据的共享。JSP提供了四种属性保存范围:page,request,session和application。
1、page:就是设置的属性只能在当前页面有效。通过pageContext的setAttribute()和getAttribute()。
2、request:指属性在一次请求范围内有效。如果页面从给一个页面跳转到另一个页面,那么该属性就失效了。这里所指的跳转是指客户端跳转,比如客户单击超链接跳转到其他页面或者通过浏览器地址栏浏览其他页面。如果使用服务器端跳转jsp:forward,则该属性仍然生效。同理使用request对象的setAttribute()和getAttribute()。
3、session:指客户浏览器与服务器一次会话范围内,如果服务器断开连接,那么属性就失效了。同理通过session对象的setAttribute()和getAttribute()。session范围的例外比如重新打开一个浏览器。
4、application:指在整个服务器范围,知道服务器停止以后才会失效。同理通过application对象的setAttribute()和getAttribute()。application范围就是保存的属性只要服务器不重启,就能在任意页面中获取,就算重新打开浏览器也是可以获取属性的。 - 移除属性:在属性的作用域还未到就想清除相应的属性时,必须编程清除。即调用相应对象的removeAttribute()方法就可以移除指定属性。
- 属性操作示例:
代码:
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>移除属性</title>
</head>
<body>
<%-- 在page范围设置属性 --%>
<%
pageContext.setAttribute("name","James"); //设置属性name,其值为James pageContext.setAttribute("age","12"); //设置属性age,其值为12 pageContext.setAttribute("sex","男"); //设置属性sex,其值为男
%>
<%-- 移除属性--%>
<% pageContext.removeAttribute("sex");
%>
<%-- 取得page范围属性--%>
<%
String strName = (String)pageContext.getAttribute("name"); //取值属性name的值 String strAge = (String)pageContext.getAttribute("age"); //取值属性age的值
String strSex = (String)pageContext.getAttribute("sex"); //取值属性sex的值 out.println("page范围:name属性值为" + strName + "<br>"); out.println("page范围:age属性值为" + strAge+ "<br>");
out.println("page范围:sex属性值为" + strSex);
%>
</body>
</html>
结果:
page范围:name属性值为James
page范围:age属性值为 12
page范围:sex属性值为 null
- request对象
方法 | 返回值类型 | 方法说明 |
---|---|---|
getParameter(String name) | String | 获取参数名为name的参数值 |
getParameterNames() | Enumeration | 获取所有参数的名称,可与上一个方法合用获取所有参数的值 |
getParameterValues(String | name) | String[] |
getParameterMap() | Map | 获取所有参数封装的Map实例,通过Map实例的String[] |
getHeader(String name) | String | 获取指定标题名称为name的标头 |
getHeaderName() | Enumeration | 获取所有的标头名称 |
getIntHeader(String name) | int | 获取标题名称为name的标头,内容以整数类型返回 |
getDateHeader(String name) | long | 获取标题名称为name的标头,内容以日期类型返回 |
getCookies() | Cookie | 获取相关的Cookie |
getContextPath() | String | 获取Context的路径 |
getMethod() | String | 获取客户端的提交方式 |
getProtocol() | String | 获取使用的HTTP协议 |
getQueryString() | String | 获取请求的字符串 |
getRequestSessionId() | String | 获取客户端的Session ID |
getRequestURI() | String | 获取请求的URI |
getRemoteAddr() | String | 获取客户端IP地址 |
- response对象
方法 | 返回值 | 方法说明 |
---|---|---|
addCookie(Cookie cookie) | void | |
addDateHeader(String name,long date) | void | |
addHeader(String name,String value) | void | |
addIntHeader(String name,int value) | void | |
setDateHeader(String name,long date) | void | |
setHeader(String name,String value) | void | |
setIntHeader(String name,int value) | void | |
sendError(int sc) | void | 传送状态码 |
sendError(int sc,String msg) | void | 传送状态码和错误信息 |
setStatus(int sc) | void | 设置状态码 |
sendRedirect(String URL) | void | 页面重定向,用来实现页面跳转 |
这里的response对象的sendRedirect(String URL)方法设置页面重定向将改变浏览器地址栏信息,所以也称客户端跳转。注意与jsp:forward动作元素进行区分。
- out对象
方法 | 返回值类型 | 方法说明 |
---|---|---|
clear() | void | 清除网页上输出内容 |
clearBuffer() | void | 清除缓冲区内容 |
close() | void | 关闭缓冲区,清除所有内容 |
getBufferSize() | int | 取得缓冲区大小 |
getRemaining() | int | 取得缓冲区剩余大小 |
isAutoFulsh() | boolean | 获得缓冲区是否进行自动清除的信息 |
print(String str) | void | 进行页面输出 |
println(String str) | void | 进行页面输出并换行 |
- session对象
方法 | 返回值类型 | 方法说明 |
---|---|---|
getId() | String | 获取session的ID |
getCreationTime() | long | 获取session的生成时间 |
getLashAccessedTime() | long | 获取用户最后通过session发送请求时间 |
getMaxInactiveInterval() | long | 获取session生命周期,如果超过这个时间则失效 |
invalidate() | void | 清空session内容 |
isNew() | boolean | 判断session是否为“新”的 |
setMaxInactiveInterval() | void | 设置session生命周期,如果超过这个时间则失效 |
- application对象
方法 | 返回值类型 | 方法说明 |
---|---|---|
getMajorVersion() | int | 获取主要的Servlet API版本 |
getMinorVersion() | int | 获取次要的Servlet API版本 |
getServerInfo() | String | 获取服务器版本 |
getMimeType() | String | 获取指定文件的MIME类型 |
getContext() | ServerContext | 获取指定Local的Application context |
getRealPath | String | 获取指定path的绝对路径 |
- pageContext对象
方法 | 返回值 | 方法说明 |
---|---|---|
getException() | Exception | 获取当前的exception内置对象 |
getOut() | JspWriter | |
getPage() | Object | |
getRequest() | ServletRequset | |
getResponse() | ServletResponse | |
getServletConfig() | ServletConfig | |
getServeltContext() | ServletContext | |
getSession() | HttpSession | |
getAttribute(String name,int scope) | Object | 获取指定范围的name属性值 |
getAttributeNamesInScope(int scope) | Enumeration | 获取指定范围所有属性名称 |
getAttributesScope(String name) | int | 获取属性名称为name的属性范围 |
removeAttribute(String name) | void | 移除属性名称为name的 属性 |
removeAttribute(String name,int scope) | void | 移除指定范围的属性名称为name的 属性 |
setAttribute(String name,Object value,int scope) | void | 设置指定范围的name属性 |
findAttribute(String name) | Object | 寻找所有范围的属性名称为name的属性 |
- page对象
示例代码:通过page对象调用Servlet类中定义的方法
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page info="this is the page Object Practice" %>
<html>
<head>
<title>page对象</title>
</head>
<body>
<%--通过page对象调用Servlet中的getServletInfo()方法 --%>
<% String info = ((javax.servlet.jsp.HttpJspPage)page).getServletInfo(); %>
<%=info %>
</body>
</html>
结果:
this is the page Object Practice.
- config对象
方法 | 返回值类型 | 方法说明 |
---|---|---|
getInitParameter(name) | String | 获取Servlet初始化参数 |
getInitParameterNames() | Enumeration | 获取Servlet所有初始化参数名称 |
getServletContext() | ServletContext | 获取当前Application context |
getServletName() | String | 获取Servlet名称 |
- exception对象
示例:exception用来处理错误异常
1、包含错误的页面:error.jsp
<%@ page language="java" contentType="text/html;charset=gb2312" errorPage="ExceptionDemo01.jsp"%>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<% int[] arr = {1,2,3}; out.println(arr[3]); %>
</body>
</html>
2、异常处理页面:exceptionDo.jsp
<%@ page language="java" contentType="text/html;charset=gb2312" isErrorPage="true"%>
<%@page import="java.io.PrintStream"%>
<html>
<head>
<title>处理错误异常</title>
</head>
<body>
<%=exception%><br>
<%=exception.getMessage()%><br>
<%=exception.getLocalizedMessage()%><br>
<% exception.printStackTrace(new java.io.PrintWriter(out)); %>
</body>
</html>
注:必须在page指令中指定属性isErrorPage属性值为true。也就是说这个页面可以用于异常处理。这样将会在exceptionDo.jsp中打印出error.jsp中的数组下标越界异常信息。
- Servlet
Servlet是在JSP之前推出的,是一种应用于服务器端的java程序,可以生成动态的web页面。Servlet并不限制所使用的的协议,但使用最多的是HTTP协议。
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 初始化后调用 init () 方法。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 销毁前调用 destroy() 方法。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
init() 方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
init 方法的定义如下:
public void init() throws ServletException {
// 初始化代码...
}
service() 方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
下面是该方法的特征:
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。
doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
destroy() 方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:
public void destroy() {
// 终止化代码...
}
架构图
下图显示了一个典型的 Servlet 生命周期方案。
第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
Servlet 容器在调用 service() 方法之前加载 Servlet。
然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。
servlet示例:
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {
private String message;
public void init() throws ServletException
{
// 执行必需的初始化
message = "Hello World";
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html");
// 实际的逻辑是在这里
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy()
{
// 什么也不做
}
}
【参考书籍】
- 《Java Web整合开发实战–基于Structs 2+Hibernate+Spring》
【参考网络资源】
- JSP系列四:JSP9个内置对象: http://www.blogjava.net/RoyPayne/archive/2012/01/05/367930.html
- Servlet 生命周期:https://www.runoob.com/servlet/servlet-life-cycle.html