Servlet基础

一.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:


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();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linsa_pursuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值