一.Web应用的演变
1.CS架构:客户端+DB
2.BC架构:浏览器+Web服务器+DB
二.安装Tomcat
1.apache-tomcat/bin/sh startup.sh run运行启动,sh shutdown.sh关闭
2.浏览器输入地址:http://localhost:8080看到"猫"代表成功
三.常见错误及解决方式
1.404:服务器根据请求地址找不到对应资源
(1)地址输入错误
(2)web.xml文件中的两个<servlet-name>不一致
(3)工程没有部署
(4)Web应用程序部署结构没有遵循Servlet规范
2.405:服务器找不到service()方法处理请求
(1)service方法名称写错
(2)service方法参数类型与标准不一致
(3)service方法异常、返回值类型与标准不一致
3.500:程序在运行中出错
(1)Servlet类没有继承HttpServlet或实现Servlet接口
(2)web.xml文件中的<servlet-class>写错
(3)service方法中的代码运行时抛出异常
四.Servlet
1.Java Bean:满足以下四点:
(1)有包
(2)有无参构造器
(3)实现序列化接口
(4)要有get,set方法
2.如何配置Servlet访问路径
(1)精确匹配
如/hello
只有/hello这一个路径可以访问HelloServlet
HelloServlet只能处理这一个请求
(2)通配符匹配
如/*
所有的路径都可以访问HelloServlet
HelloServlet能处理所有请求
(3)后缀匹配
如*.abc
所有以abc为后缀的路径都可以访问HelloServlet
HelloServlet可以处理相似的一批请求
五.HTTP协议(HyperText Transfer Protocol)——由w3c(万维网联盟)制定的一种应用层协议
1.请求数据包组成
(1)请求行(requestline):请求方式+请求资源路径+协议版本
(2)消息头(header):键值对,大部分为自动生成
(3)实体内容(body):只有当请求方式为post时,实体内容才会有数据
2.响应数据包组成
(1)状态行(status line):协议类型+版本+状态码+状态描述
(2)消息头(header):服务器返回一些消息头给浏览器
(3)实体内容(Entity):程序处理的结果
3.HttpServletRequest对象
(1)获取访问路径(请求行)
URI和URL的区别:
狭义的理解:从java项目中理解 URI:绝对路径 URL:完整路径 URL包含流URI
广义的理解:从任意的WEB项目理解 URI:一个资源的名字 URL:一个资源的真名 URI包含了URL
req.getContextPath()
req.getServletPath()
req.getRequestURI()
req.getRequestURL()
req.getMethod()
(2)Enumeration(枚举)与 Iterator(迭代)一样,Iterator 更加简洁。
Enumeration<String> names = req.getHeaderNames();
boolean flag = names.hasMoreElements();
names.nextElement();——请求头名字
req.getHeader(String name)——请求头的值
4.HttpServletResponse对象
(1)文本用PW类型的流响应
resp.setContentType("text/html;charset=utf-8")
resp.getWriter().write("<h1>追逐的敏</h1>")
(2)setContentType("text/html")
resp.getWriter().print("ok")
(3)非文本用OS类型的流响应
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("01.jpg");
resp.setStatus(200);
resp.setContentType("image/jpg");
resp.setContentLength((int)jpgFile.length());
OutputStream out = resp.getOutputStream();
int b;
while((b=bis.read())!=-1) {
out.write(b);
}
(4)利用ServletContext 提供方法getRealPath将web 路径转换为本地实际路径
String path = "/01.jpg";
ServletContext ctx = getServletContext();
String realPath = ctx.getRealPath(path);
File jpgFile = new File(realPath);
(5)重定向状态码302由服务器自动增加
resp.sendRedirect("find.emp");
5.获取表单中请求参数值(参数名不存在,产生null)
(1)获取Name-Value的方法:getParameter("name")
(2)获取Name-Values的方法(一般用于提交表单中复选框的值):getParameterValues("name")
6.请求方式的种类
(1)GET:请求指定的资源
在文件中改解码方式
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1"/>
(2)POST:向指定资源提交需要处理的数据
设置表单method属性为post,默认情况下会使用iso-8859-1解码
设置解码方式:
request.setCharacterEncoding("utf-8")
(3)HEAD:要求响应与相应的GET一样,但没有响应体
(4)PUT:上传指定资源
(5)DELETE:删除指定资源
HttpServletResponse对象响应图片Demo:
1.CS架构:客户端+DB
2.BC架构:浏览器+Web服务器+DB
二.安装Tomcat
1.apache-tomcat/bin/sh startup.sh run运行启动,sh shutdown.sh关闭
2.浏览器输入地址:http://localhost:8080看到"猫"代表成功
三.常见错误及解决方式
1.404:服务器根据请求地址找不到对应资源
(1)地址输入错误
(2)web.xml文件中的两个<servlet-name>不一致
(3)工程没有部署
(4)Web应用程序部署结构没有遵循Servlet规范
2.405:服务器找不到service()方法处理请求
(1)service方法名称写错
(2)service方法参数类型与标准不一致
(3)service方法异常、返回值类型与标准不一致
3.500:程序在运行中出错
(1)Servlet类没有继承HttpServlet或实现Servlet接口
(2)web.xml文件中的<servlet-class>写错
(3)service方法中的代码运行时抛出异常
四.Servlet
1.Java Bean:满足以下四点:
(1)有包
(2)有无参构造器
(3)实现序列化接口
(4)要有get,set方法
2.如何配置Servlet访问路径
(1)精确匹配
如/hello
只有/hello这一个路径可以访问HelloServlet
HelloServlet只能处理这一个请求
(2)通配符匹配
如/*
所有的路径都可以访问HelloServlet
HelloServlet能处理所有请求
(3)后缀匹配
如*.abc
所有以abc为后缀的路径都可以访问HelloServlet
HelloServlet可以处理相似的一批请求
五.HTTP协议(HyperText Transfer Protocol)——由w3c(万维网联盟)制定的一种应用层协议
1.请求数据包组成
(1)请求行(requestline):请求方式+请求资源路径+协议版本
(2)消息头(header):键值对,大部分为自动生成
(3)实体内容(body):只有当请求方式为post时,实体内容才会有数据
2.响应数据包组成
(1)状态行(status line):协议类型+版本+状态码+状态描述
(2)消息头(header):服务器返回一些消息头给浏览器
(3)实体内容(Entity):程序处理的结果
3.HttpServletRequest对象
(1)获取访问路径(请求行)
URI和URL的区别:
狭义的理解:从java项目中理解 URI:绝对路径 URL:完整路径 URL包含流URI
广义的理解:从任意的WEB项目理解 URI:一个资源的名字 URL:一个资源的真名 URI包含了URL
req.getContextPath()
req.getServletPath()
req.getRequestURI()
req.getRequestURL()
req.getMethod()
(2)Enumeration(枚举)与 Iterator(迭代)一样,Iterator 更加简洁。
Enumeration<String> names = req.getHeaderNames();
boolean flag = names.hasMoreElements();
names.nextElement();——请求头名字
req.getHeader(String name)——请求头的值
4.HttpServletResponse对象
(1)文本用PW类型的流响应
resp.setContentType("text/html;charset=utf-8")
resp.getWriter().write("<h1>追逐的敏</h1>")
(2)setContentType("text/html")
resp.getWriter().print("ok")
(3)非文本用OS类型的流响应
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("01.jpg");
resp.setStatus(200);
resp.setContentType("image/jpg");
resp.setContentLength((int)jpgFile.length());
OutputStream out = resp.getOutputStream();
int b;
while((b=bis.read())!=-1) {
out.write(b);
}
(4)利用ServletContext 提供方法getRealPath将web 路径转换为本地实际路径
String path = "/01.jpg";
ServletContext ctx = getServletContext();
String realPath = ctx.getRealPath(path);
File jpgFile = new File(realPath);
(5)重定向状态码302由服务器自动增加
resp.sendRedirect("find.emp");
5.获取表单中请求参数值(参数名不存在,产生null)
(1)获取Name-Value的方法:getParameter("name")
(2)获取Name-Values的方法(一般用于提交表单中复选框的值):getParameterValues("name")
6.请求方式的种类
(1)GET:请求指定的资源
在文件中改解码方式
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1"/>
(2)POST:向指定资源提交需要处理的数据
设置表单method属性为post,默认情况下会使用iso-8859-1解码
设置解码方式:
request.setCharacterEncoding("utf-8")
(3)HEAD:要求响应与相应的GET一样,但没有响应体
(4)PUT:上传指定资源
(5)DELETE:删除指定资源
HttpServletResponse对象Demo:
package day02;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemoServlet extends HttpServlet {
/**
* Request 代表用户发起的请求: Request对象将浏览器
* 发送来的Http 请求解析为对象的属性。只要使用request
* 对象的方法就可以获取http请求的全部信息
*/
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求行
String uri = req.getRequestURI();
StringBuffer url = req.getRequestURL();
System.out.println(req.getContextPath());
System.out.println(req.getServletPath());
System.out.println(uri);
System.out.println(url);
//请求头
//Enumeration(枚举) 与 Iterator(迭代) 一样,
//没有差别, Iterator 更加简洁。
Enumeration<String> names = req.getHeaderNames();
while(names.hasMoreElements()) {
//name 每个请求头的名
String name = names.nextElement();
//获取请求头的value
String val = req.getHeader(name);
//输出请求头
System.out.println(name+":"+val);
}
//获取地址栏上的请求参数
//query 查询
String queryString=req.getQueryString();
System.out.println(queryString);
//简单响应浏览器的请求
resp.setContentType("text/html");
resp.getWriter().println("OK");
}
}
HttpServletResponse对象响应图片Demo:
package day02;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Servlet API 提供将WEB 路径转换为实际
//本地路径的API方法
//如下是相对路径webapp文件夹相对路径
String path = "/01.jpg";
//利用ServletContext 提供方法getRealPath
//将web 路径转换为本地实际路径
//转换后:/home/soft01/apache-tomcat-8.5.20/wtpwebapps/servlet1
ServletContext ctx = getServletContext();
String realPath = ctx.getRealPath(path);
System.out.println("path:"+path);
System.out.println("realPath:"+realPath);
File jpgFile = new File(realPath);
FileInputStream in = new FileInputStream(jpgFile);
BufferedInputStream bis = new BufferedInputStream(in);
//响应状态行
resp.setStatus(200);
//发送响应头
resp.setContentType("image/jpg");
resp.setContentLength((int)jpgFile.length());
//发送body
OutputStream out = resp.getOutputStream();
byte[] data = new byte[1024*10];
int len;
while((len=bis.read(data))!=-1) {
out.write(data,0,len);
}
in.close();
out.close();
}
}