JSP本身就是Servlet,只是Servlet的不同表现形式。
背景知识
常用的Web服务器
- IIS Microsoft专用
- Apache C语言编写
- Tomcat Java语言编写
通常的动态网页技术
- CGI(Common GateWay Interface)
- API常用的有NSAPI、ISAPI
- ASP(Active Server Page) 以进程方式运行,效率较低,现在演化为ASP.net。
- PHP(Personal Home Page)
- JSP/Servlet(Java Server Page) 以线程方式运行
Servlet简介
- 服务器小应用程序(Server let)
- 完成B/S架构下客户端请求的响应处理
- 平台独立性能良好,以线程方式运行
- Servlet API为Servlet提供了统一的编程接口
- Servlet在容器中运行
- 常见Servlet容器Tomcat
Tomcat 初步
Tomcat是一个WebServer,是JSP的容器,是Servlet的容器。
cd D:/tomcat/bin
# windows下查看tomcat版本
version
# windows下启动关闭tomcat
startup
shudown
# windows以catalina方式启动关闭tomcat
catalina startup
catalina shudown
# 以catalina的debug模式启动
catalina debug
run
# 访问 http://127.0.0.1:8080
若tomcat启动失败,需要检查下
- JAVA_HOME环境变量配置
- 系统防火墙端口设置
- 查看启动日志
- 以catalina的debug模式启动
- 检查默认端口是否被占用
Tomcat目录结构
tomcat 5.5.14
-
bin
二进制可执行文件和脚本 -
common
Catalina本身和web应用可加载的类目录 -
conf
配置文件目录 -
logs
日志目录 -
server
服务器所需类库目录 -
shared
WebApp共享的类库 -
webapps
Web应用所存放的目录applications -
work
Tomcat工作目录,存放jsp产生的class文件 -
temp
临时文件目录
Tomcat配置文件
-
conf/server.xml
服务器主配置文件 -
conf/web.xml
web应用配置,缺省的Servlet定义和MIME类型定义 -
conf/tomcat-users.xml
Tomcat用户信息
Tomcat 管理页面设置管理员和密码
Tomcat8定义4中角色
manager-gui
manager-script
manager-jmx
manager-ststus
# conf/tomcat-users.xml
访问
http://127.0.0.1:8080/manager/status
账户/密码:admin/admin
http://127.0.0.1:8080/manager/html
账户/密码:admin/admin
IDE:Interllij IDEA 2017.2.6
创建Servlet
# 创建包
com.test.servlet
# 创建Servlet文件
src/com/test/serlvet/Servlet.java
package com.test.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("do get success");
}
}
# web.xml添加配置
Servlet
com.test.servlet.Servlet
Servlet
/test
# 访问路由
http://127.0.0.1/test/test
HTTP协议基础
GET请求
GET /latest.html HTTP/1.1
Host: http://127.0.0.1
Content-Type: text/html
...
POST 请求
POST /servlet/serv HTTP/1.1
Host: http://127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
username=alice&password=alice
响应信息
HTTP/1.1 200 OK
Date: Fri,31 Dec 2017 12:30:32 GMT
Content-Type: text/html
Content-length: 280
测试
package com.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class Test {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1", 8888);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.println("GET / HTTP/1.1");
pw.println("Host: http://127.0.0.1/test");
pw.println("Content-Type: text/html");
pw.println();
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = "";
while((str = br.readLine()) != null){
System.out.println(str);
}
br.close();
pw.close();
socket.close();
}
}
Web Application的概念
- WebApplicationName
-
WEB-INF
-
web.xml
WebApp的配置文件 -
lib
WebApp库文件 -
classes
存放编译后的servlet
-
-
META-INF
存放WebApp上下文信息,符合J2EE标准。
-
Web Application可直接放在webapps目录下, 也可通过配置文件指定到其他目录。
# tomcat/conf/server.xml
Servlet
查看手册 https://docs.oracle.com/javaee/7/api/toc.htm
项目引入tomcat/lib/servlet-api.jar
包
创建 UserServlet
# src/com/test/servlet/UserServlet.java
package com.test.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("success");//在后台打印数据
//获取GET参数
//向客户端写入数据
response.getWriter().write("ok");
}
}
配置 web.xml
# web/WEB-INF/web.xml
UserServlet
com.test.servlet.UserServlet
UserServlet
/user
编辑前台 index.jsp
# web/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
homepage
访问 http://127.0.0.1/test/user
Servlet生命周期
# src/com/test/servlet/UserServlet.java
package com.test.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
/*构造方法*/
public UserServlet(){
System.out.println("constructor");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
@Override
public void destroy() {
System.out.println("destroy");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");//在服务端控制台打印输出数据
//向客户端写入数据
response.getWriter().write("ok");
}
}
Servlet声明周期中只存在一个对象提供服务
第一次访问
http://127.0.0.1:8080/test/user
,执行输出constructor => init => doGet
。第二次访问
http://127.0.0.1:8080/test/user
,执行输出doGet
。
只有当tomcat进行shutdown
时会执行destroy()
,可通过catalina debug
启动tomcat查看。在整个Web Application退出的时候,Servlet的destroy()
会被调用。
Servlet生命周期
- 加载 classLoader加载类文件
- 实例化
constructor
new对象实例化时 - 初始化
init()
仅执行一次,即第一次初始化时执行。 - 处理请求
doGet() / doPost()
- 退出服务
destroy()
Web Application退出是被调用
Servlet编程接口
-
GenericServlet
是所有Servlet的鼻祖 - 用于HTTP的Servlet编程都通过继承
javax.servlet.http.HttpServlet
实现 - 请求处理方法,分别对应HTTP协议的7中请求
- doGet() 响应GET请求
- doPost() 响应POST请求
- doPut() 用于HTTP协议的1.1版本
- doDelete() 用于HTTP协议的1.1版本
- doHead() 仅响应GET请求的头部
- doOptions() 用于HTTP协议的1.1版本
- doTrace() 用于HTTP协议的1.1版本
- 在非分布式的环境下,通常仅有一个Servlet在服务器中,即仅存在一个实例对象。
处理请求
访问地址 http://127.0.0.1:8080/test/user
# web/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
homepage
用户管理
添加用户
# src/com/test/servlet/UserServlet.java
package com.test.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端提交数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//向客户端写入数据
PrintWriter pw = response.getWriter();
response.setContentType("text/html");//设置响应的编码格式
pw.println(username);
pw.println(password);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
# web/WEB-INF/web.xml
UserServlet
com.test.servlet.UserServlet
UserServlet
/user
获取请求的所有参数
# web/product.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
商品管理
添加商品
具有两个相同的name为quantity的单行文本框
# src/com/test/servlet/ProductServlet.java
package com.test.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet(name = "ProductServlet")
public class ProductServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String value = "";
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()){
String name = (String)names.nextElement();
String[] values = request.getParameterValues(name);
if(values.length==1){
value = values[0];
}else{
for(int i=0; i
getParameterNames()
getParameterValues()
hasMoreElements()
nextElement()
# web/WEB-INF/web.xml
ProductServlet
com.test.servlet.ProductServlet
ProductServlet
/product
访问 http://127.0.0.1:8080/test/product.jsp
处理COOKIE
- HTTP协议无连接性(短连接)要求出现一种保存C/S间状态的机制
- Cookie保存客户端的一个文本文件与特定客户端相关
- Cookie以"键值对"(名值对)形式存放数据,非常类似Map。
- 创建Cookie
new Cookie(name,value)
- 设置获取Cookie
setName(String name) / getName()
setValue(String value) / getValue()
setMaxAge(int age) / getMaxAge()
- 使用
HttpServletResponse
类addCookie(Cookie)
将Cookie设置到客户端 - 使用
HttpServletRequest
类getCookie()
读取客户端所有Cookie,返回Cookie数组。
问题分析
- 服务端可向客户端写内容,仅能是文本内容。
- 客户端可组织服务端写入
- 服务端仅能获取到自己web application写入的内容
Chrome中Cookie文件位置
C:\Users\jc\AppData\Local\Google\Chrome\User Data\Default\Cookies