《Day11》Servlet进阶知识

一、HttpServletRequest接口

HttpServletRequest作用:请求对象,处理客户端向服务器端发送请求时的数据的。

servlet 容器创建了一个 HttpServletRequest 对象并将之作为一个参数传送给 servlet’s service 方法 (如doGet, doPost, 等).

组成 :请求行 请求头 请求体

1. 请求行 :查看请求的通用信息

在这里插入图片描述

请求路径:url http://127.0.0.1:9527/day11/first?age=20

请求方式: get

状态码:200 请求成功

2. 请求头 :常用的请求信息

在这里插入图片描述

​ 封装了请求的全部信息,包含了发送的ip地址,端口号,发送的的地址等等

3. 请求体:封装了用户向服务器发送的数据 掌握

在这里插入图片描述

get 请求的数据是以字符串的形式附着在url的后面,以?的传值方式发送到后台,如果有多个数据中间用&隔开
在这里插入图片描述

post 请求是以 form-data的对象形式传递数据的,传送数据量大,效率较低

在这里插入图片描述

Servlet的常用方法:

1:获取单个数据值 获取的都是表单的value

​ String str = request.getParameter(“name属性值”);

2:获取多个值,复选框的值

​ String hobby[] = request.getParameterValues(“hobby”);

3:其他方法

    System.out.println(request.getProtocol());  //项目全协议  http/1.1
	System.out.println(request.getScheme());   //协议
	System.out.println(request.getServerName());  // ip地址
	System.out.println(request.getServerPort());  //端口号
	System.out.println(request.getContextPath()); //获取上下文路径(项目根路径)
	System.out.println(request.getQueryString());  // 请求的数据 get
	System.out.println(request.getRequestURL()); //  项目绝对路径 从协议开始
	System.out.println(request.getRequestURI());  //项目的根路径  从项目名开始

注册案例:

案例-文件上传

  1. 制作上传的html页面

    1.1 添加图片表单控件

在这里插入图片描述

1.2 :修改数据库,添加一列 photo 类型 varchar 只需要保存图片的地址即可

在这里插入图片描述

1.3:修改javaBean 给Student类添加属性 photo String

  1. 修改表单属性

    ​ (1) 表单的提交方式必须是post

在这里插入图片描述

​ (2) 在form标签中添加属性enctype=”multipart/form-data”

  1. 创建servlet完成上传操作

注意:给具有文件上传功能的servlet添加注解 注解写在类的上面

​ @MultipartConfig

Part接口自Servlet3.0版本之后提供文件上传操作的接口

在这里插入图片描述

  1. 代码编写:

    package com.offcn.servlet;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.UUID;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    
    import com.offcn.bean.Student;
    import com.offcn.dao.StudentDao;
    import com.offcn.util.UploadFileUtils;
    
    
    
    @MultipartConfig
    public class RegisterServlet extends HttpServlet {
    	
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//1处理乱码
    		req.setCharacterEncoding("utf-8");
    		//2:接受数据
    		String name = req.getParameter("name");
    		int age = Integer.parseInt(req.getParameter("age"));  //前端传来的值都是字符串
    		String sex = req.getParameter("sex");
    		//获取图片  头像
    		//1: 获取Part对象
    		Part part = req.getPart("photo");
    		//调用上传的方法
    		String photo = UploadFileUtils.upload(part);
    		
    		String email = req.getParameter("email");
    		String phone = req.getParameter("phone");
    		//将数据封装到对象
    		Student stu = new Student(name, age, sex,photo,email, phone);
    		//3:调用dao
    		StudentDao  sd = new StudentDao();
    		int num = sd.addStudent(stu);
    		//4:处理结果,给出响应
    		resp.setContentType("text/html;charset=utf-8");
    		PrintWriter pw = resp.getWriter();
    		if(num>0) {
    			pw.print("<h3 style='color:green;'>添加成功</h3>");
    		}else {
    			pw.print("<h3 style='color:red;'>添加失败</h3>");
    		}		
    		
    	}
    
    }
    
    
  2. 工具类 UploadFileUtils

    package com.offcn.util;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.UUID;
    
    import javax.servlet.http.Part;
    
    public class UploadFileUtils {
    	
    	
    	public static String upload(Part part) {
    		//获取文件名
    		String fileName = part.getSubmittedFileName();
    		
    		//创建目录结构
    		File file = new File("E:\\中公教育\\1026就业班74班\\photo");
    		if(!file.exists()) {
    			file.mkdirs();
    		}
    		
    		//获取一个随机的UUID
    		String uuid = UUID.randomUUID().toString();
    		String photo = file.getPath()+"\\"+uuid+fileName;
    		//向文件夹写文件
    		try {
    			part.write(photo);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    				
    		
    		//只返回uuid+文件名
    		return uuid+fileName;
    	}
    
    }
    
    
    

二、HttpServletResponse接口

HttpServletResponse:响应对象 ,处理完客户端的请求数据后,给客户端输入了些响应内容(文本、图片、视频、页面跳转)。

组成 :响应行 响应头 响应体

1. 响应行

响应行中包含两个信息:协议 状态码

在这里插入图片描述

1. 协议http 1.1

其他协议:tcp/udp 协议 ,ftp 文件协议, ip协议

​ http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

http:表示层 应用层 (桌面层)

TCP层:3次握手协议,一种有连接的协议,数据量大,安全,效率低

UDP:无连接协议,数据量小,不安全,效率高

IP协议:点分十进制 192.168.12.123;

HTTP 发展过程:

​ http:0.9:协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。

http:1.0: 到了1.0协议阶段,也就是在1982年,TimBerners-Lee提出了HTTP/1.0。在此后的不断丰富和发展中,HTTP/1.0成为最重要的面向事务的应用层协议。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。

​ 短连接:一次请求和响应完毕后,立马断开,连接没有复用,浪费资源

http:1.1比较与1.0协议,多了一个长连接 连接时长20s,保持一个长连接

在这里插入图片描述

http:2.0:无需请求,直接响应(推送服务,手机端用的比较多)

2. 状态码

在这里插入图片描述

​ 200:请求和响应成功

​ 302:重定向(服务器跳转时候的一种状态)

​ 403:拒绝服务

404:未找到资源 (1:路径写错了 2:没有路径 3:文件写到WEB-INF中了)

​ 405:请求方式有误

500:内部服务器错误(代码逻辑有误)

2.响应头

1:设置响应类型

在这里插入图片描述

setHeader和addHead的区别

1:setHeader会覆盖key同名的值,addHeader不会覆盖key同名的值

​ resp.setHeader(“content-type”,“text/html;charset=utf-8”);
resp.setContentType(“text/html;charset=utf-8”);

2:除了可以响应默认的text文本以外,还可以响应图片,文件,视频,连接

案例:响应图片

  1. 先将本地图片读取到计算机内存中

  2. 从内存输出到网页中

案例:文件下载

设置响应类型:

response.setHeader(“content-disposition”, “attachment;filename=”+URLEncoder.encode(file.getName(),“UTF-8”));

package com.offcn.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownLoadServlet extends HttpServlet {
	
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1:设置响应头
		resp.setContentType("image/jpeg");
		//resp.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));
		//设置下载方式,以另存为方式下载
		resp.setHeader("content-disposition", "attachment;filename=2.jpg");
		//2:读取服务器的图片到内存
		String path = req.getContextPath();
		InputStream is = new FileInputStream("E:/中公教育/1026就业班74班/workspace/day11/WebContent/img/2.jpg");
		//通过响应获取输出流
		ServletOutputStream os = resp.getOutputStream();
		
		//下载到网页上
		int num = 0;
		while((num = is.read())!=-1) {
			//向浏览器输出图片
			os.write(num);
		}
		//关流
		is.close();
		os.close();
		
	}
	
}

3. 响应体

文本,图片,文件,视频,多媒体,页面,超链接

​ 1:响应文本

   ~~~java

//设置响应格式
resp.setContentType(“text/html;charset=utf-8”);
//响应文本
PrintWriter pw = resp.getWriter();
//println 表示空格,不是换行
pw.println(“我是第一行
”);
pw.println(“我是第二行”);
pw.close();
~~~

​ 2:响应Html

//1:设置响应格式
  	resp.setContentType("text/html;charset=utf-8");
  	//2:响应内容  html页面
  	PrintWriter pw = resp.getWriter();
  	
  	pw.print("<html>");
  	pw.print("<head></head>");
  	pw.print("<body>");
  	pw.print("<div style='width:200px;height:200px;background-color:red;'>我是div");
  	pw.print("</div>");
  	pw.print("</body>");
  	pw.print("</html>");
  	
  	pw.close();

3:响应超链接

//响应超链接  重定向
resp.sendRedirect("div.html");

三、MVC设计模式

分层开发:

​ 三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、==业务逻辑层(BLL)数据访问层(DAL)==三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。 [1]

三层架构区分层次的目的是为了 “高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。

MVC设计模式:

m:model 模型层

​ dao:数据访问层 UserDao,StudentDao

​ javabean:实体类 User,Student

​ util:xxxUTils 工具类

​ service:业务层 (专门来处理业务逻辑)

v:view 视图层:html,jsp

c:control 控制层: servlet

在这里插入图片描述

项目中分层和MVC:

在这里插入图片描述

业务层:复杂的逻辑业务,使用业务层

下单: 查询订单,添加购物车,填写用户信息,购物地址,支付,确认,收获

业务层可以暂时省略,二级段项目把service加上

MVC优点:高内聚,低耦合,提高代码的复用率,减少代码的关联,后期项目维护简单

MVC缺点:层级太多,会增加开发难度,页面跳转难度复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿福真的不想掉头发

大爷?赏点?

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

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

打赏作者

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

抵扣说明:

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

余额充值