最新JavaWeb:HTTP、Request、Response,springcloud原理面试题

总结

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

//2.(*)获取虚拟目录:/day14

String contextPath = request.getContextPath();

System.out.println(contextPath);

//3. 获取Servlet路径: /demo1

String servletPath = request.getServletPath();

System.out.println(servletPath);

//4. 获取get方式请求参数:name=zhangsan

String queryString = request.getQueryString();

System.out.println(queryString);

//5.(*)获取请求URI:/day14/demo1

String requestURI = request.getRequestURI();

StringBuffer requestURL = request.getRequestURL();

System.out.println(requestURI);

System.out.println(requestURL);

//6. 获取协议及版本:HTTP/1.1

String protocol = request.getProtocol();

System.out.println(protocol);

//7. 获取客户机的IP地址:

String remoteAddr = request.getRemoteAddr();

System.out.println(remoteAddr);

}

}

  1. 获取请求头数据
  • 方法:

  • (*)String getHeader(String name):通过请求头的名称获取请求头的值

获取user-agent

package cn.itcast.web.request;

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.util.Enumeration;

@WebServlet(“/requestDemo3”)

public class RequestDemo3 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//演示获取请求头数据:user-agent

String agent = request.getHeader(“user-agent”);

//判断agent的浏览器版本

if(agent.contains(“Chrome”)){

//谷歌

System.out.println(“谷歌来了…”);

}else if(agent.contains(“Firefox”)){

//火狐

System.out.println(“火狐来了…”);

}

}

}

获取referer

package cn.itcast.web.request;

import javax.servlet.ServletContext;

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(“/requestDemo4”)

public class RequestDemo4 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//演示获取请求头数据:referer

String referer = request.getHeader(“referer”);

System.out.println(referer);//http://localhost/day14/login.html

//防盗链

if(referer != null ){

if(referer.contains(“/day14”)){

//正常访问

// System.out.println(“播放电影…”);

response.setContentType(“text/html;charset=utf-8”);

response.getWriter().write(“播放电影…”);

}else{

//盗链

//System.out.println(“想看电影吗?来优酷吧…”);

response.setContentType(“text/html;charset=utf-8”);

response.getWriter().write(“想看电影吗?来优酷吧…”);

}

}

}

}

  • Enumeration getHeaderNames():获取所有的请求头名称

package cn.itcast.web.request;

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.util.Enumeration;

@WebServlet(“/requestDemo2”)

public class RequestDemo2 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//演示获取请求头数据

//1.获取所有请求头名称

Enumeration headerNames = request.getHeaderNames();

//2.遍历

while(headerNames.hasMoreElements()){

String name = headerNames.nextElement();

//根据名称获取请求头的值

String value = request.getHeader(name);

System.out.println(name+“—”+value);

}

}

}

  1. 获取请求体数据:
  • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

  • 步骤:

  1. 获取流对象
  • BufferedReader getReader():获取字符输入流,只能操作字符数据

  • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

  1. 再从流对象中拿数据

package cn.itcast.web.request;

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.BufferedReader;

import java.io.IOException;

@WebServlet(“/requestDemo5”)

public class RequestDemo5 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取请求消息体–请求参数

//1.获取字符流

BufferedReader br = request.getReader();

//2.读取数据

String line = null;

while((line = br.readLine()) != null){

System.out.println(line);

}

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

}

  1. 其他功能:

  2. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数

  3. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123

  4. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game

  5. Enumeration getParameterNames():获取所有请求的参数名称

  6. Map<String,String[]> getParameterMap():获取所有参数的map集合

  • 中文乱码问题:

  • get方式:tomcat 8 已经将get方式乱码问题解决了

  • post方式:会乱码

解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

package cn.itcast.web.request;

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.BufferedReader;

import java.io.IOException;

import java.util.Enumeration;

import java.util.Map;

import java.util.Set;

@WebServlet(“/requestDemo6”)

public class RequestDemo6 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//post 获取请求参数

//根据参数名称获取参数值

String username = request.getParameter(“username”);

/* System.out.println(“post”);

System.out.println(username);*/

//根据参数名称获取参数值的数组

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

/*for (String hobby : hobbies) {

System.out.println(hobby);

}*/

//获取所有请求的参数名称

Enumeration parameterNames = request.getParameterNames();

/*while(parameterNames.hasMoreElements()){

String name = parameterNames.nextElement();

System.out.println(name);

String value = request.getParameter(name);

System.out.println(value);

System.out.println(“----------------”);

}*/

// 获取所有参数的map集合

Map<String, String[]> parameterMap = request.getParameterMap();

//遍历

Set keyset = parameterMap.keySet();

for (String name : keyset) {

//获取键获取值

String[] values = parameterMap.get(name);

System.out.println(name);

for (String value : values) {

System.out.println(value);

}

System.out.println(“-----------------”);

}

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//get 获取请求参数

/*

//根据参数名称获取参数值

String username = request.getParameter(“username”);

System.out.println(“get”);

System.out.println(username);*/

this.doPost(request,response);

}

}

  1. 请求转发:一种在服务器内部的资源跳转方式

在这里插入图片描述

  1. 步骤:

  2. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

  3. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

  4. 特点:

  5. 浏览器地址栏路径不发生变化

  6. 只能转发到当前服务器内部资源中。

  7. 转发是一次请求

package cn.itcast.web.request;

import javax.servlet.RequestDispatcher;

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(“/requestDemo8”)

public class RequestDemo8 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println(“demo8888被访问了。。。”);

//转发到demo9资源

/*

RequestDispatcher requestDispatcher = request.getRequestDispatcher(“/requestDemo9”);

requestDispatcher.forward(request,response);

*/

//存储数据到request域中

request.setAttribute(“msg”,“hello”);

request.getRequestDispatcher(“/requestDemo9”).forward(request,response);

//request.getRequestDispatcher(“http://www.itcast.cn”).forward(request,response);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request,response);

}

}

  1. 共享数据:
  • 域对象:一个有作用范围的对象,可以在范围内共享数据

  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

  • 方法:

  1. void setAttribute(String name,Object obj):存储数据

  2. Object getAttitude(String name):通过键获取值

  3. void removeAttribute(String name):通过键移除键值对

结合上面存储代码一起看

package cn.itcast.web.request;

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(“/requestDemo9”)

public class RequestDemo9 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取数据

Object msg = request.getAttribute(“msg”);

System.out.println(msg);

System.out.println(“demo9999被访问了。。。”);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request,response);

}

}

  1. 获取ServletContext:
  • ServletContext getServletContext()

3. 案例

=================================================================

需求:

  1. 编写login.html登录页面

username & password 两个输入框

  1. 使用Druid数据库连接池技术,操作mysql,day14数据库中user表

  2. 使用JdbcTemplate技术封装JDBC

  3. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您

  4. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

分析

在这里插入图片描述

开发步骤

  1. 创建项目,导入html页面,配置文件,jar包在这里插入图片描述

  2. 创建数据库环境

CREATE DATABASE day14;

USE day14;

CREATE TABLE USER(

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(32) UNIQUE NOT NULL,

PASSWORD VARCHAR(32) NOT NULL

);

  1. 创建包cn.itcast.domain,创建类User

package cn.itcast.domain;

/**

  • 用户的实体类

*/

public class User {

private int id;

private String username;

private String password;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

@Override

public String toString() {

return “User{” +

“id=” + id +

“, username='” + username + ‘’’ +

“, password='” + password + ‘’’ +

‘}’;

}

}

  1. 创建包cn.itcast.util,编写工具类JDBCUtils

package cn.itcast.util;

importcom.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;

import javax.xml.crypto.Data;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.Properties;

/**

  • JDBC工具类 使用Durid连接池

*/

public class JDBCUtils {

private static DataSource ds ;

static {

try {

//1.加载配置文件

Properties pro = new Properties();

//使用ClassLoader加载配置文件,获取字节输入流

InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream(“druid.properties”);

pro.load(is);

//2.初始化连接池对象

ds = DruidDataSourceFactory.createDataSource(pro);

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

  • 获取连接池对象

*/

public static DataSource getDataSource(){

return ds;

}

/**

  • 获取连接Connection对象

*/

public static Connection getConnection() throws SQLException {

return ds.getConnection();

}

}

  1. 创建包cn.itcast.dao,创建类UserDao,提供login方法

package cn.itcast.dao;

import cn.itcast.domain.User;

import cn.itcast.util.JDBCUtils;

import org.springframework.dao.DataAccessException;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.JdbcTemplate;

/**

  • 操作数据库中User表的类

*/

public class UserDao {

//声明JDBCTemplate对象共用

private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

/**

  • 登录方法

  • @param loginUser 只有用户名和密码

  • @return user包含用户全部数据,没有查询到,返回null

*/

public User login(User loginUser){

try {

//1.编写sql

String sql = “select * from user where username = ? and password = ?”;

//2.调用query方法

User user = template.queryForObject(sql,

new BeanPropertyRowMapper(User.class),

loginUser.getUsername(), loginUser.getPassword());

return user;

} catch (DataAccessException e) {

e.printStackTrace();//记录日志

return null;

}

}

}

  1. 编写cn.itcast.web.servlet.LoginServlet类

package cn.itcast.web.servlet;

import cn.itcast.dao.UserDao;

import cn.itcast.domain.User;

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(“/loginServlet”)

public class LoginServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//1.设置编码

req.setCharacterEncoding(“utf-8”);

//2.获取请求参数

String username = req.getParameter(“username”);

String password = req.getParameter(“password”);

//3.封装user对象

User loginUser = new User();

loginUser.setUsername(username);

loginUser.setPassword(password);

//4.调用UserDao的login方法

UserDao dao = new UserDao();

User user = dao.login(loginUser);

//5.判断user

if(user == null){

//登录失败

req.getRequestDispatcher(“/failServlet”).forward(req,resp);

}else{

//登录成功

//存储数据

req.setAttribute(“user”,user);

//转发

req.getRequestDispatcher(“/successServlet”).forward(req,resp);

}

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

this.doGet(req,resp);

}

}

  1. 编写FailServlet和SuccessServlet类

@WebServlet(“/successServlet”)

public class SuccessServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取request域中共享的user对象

User user = (User) request.getAttribute(“user”);

if(user != null){

//给页面写一句话

//设置编码

response.setContentType(“text/html;charset=utf-8”);

//输出

response.getWriter().write(“登录成功!”+user.getUsername()+“,欢迎您”);

}

}

@WebServlet(“/failServlet”)

public class FailServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//给页面写一句话

//设置编码

response.setContentType(“text/html;charset=utf-8”);

//输出

response.getWriter().write(“登录失败,用户名或密码错误”);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request,response);

}

}

  1. login.html中form表单的action路径的写法

虚拟目录+Servlet的资源路径

  1. BeanUtils工具类,简化数据封装

在这里插入图片描述

用于封装JavaBean的

  1. JavaBean:标准的Java类

  2. 要求:

  3. 类必须被public修饰

  4. 必须提供空参的构造器

  5. 成员变量必须使用private修饰

  6. 提供公共settergetter方法

  7. 功能:封装数据

  8. 概念:

成员变量:

属性:setter和getter方法截取后的产物

例如:getUsername() --> Username–> username

  1. 方法:

  2. setProperty():设置属性值

  3. getProperty():获取属性值

  4. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

4. Response

=======================================================================

  • 功能:设置响应消息
  1. 设置响应行

  2. 格式:HTTP/1.1 200 ok

  3. 设置状态码:setStatus(int sc)

  4. 设置响应头:setHeader(String name, String value)

  5. 设置响应体:

  • 使用步骤:
  1. 获取输出流
  • 字符输出流:PrintWriter getWriter()

  • 字节输出流:ServletOutputStream getOutputStream()

  1. 使用输出流,将数据输出到客户端浏览器

案例:


① 完成重定向

  1. 重定向:资源跳转的方式

在这里插入图片描述

  1. 代码实现:

package cn.itcast.web.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(“/responseDemo1”)

public class ResponseDemo1 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println(“demo1…”);

//访问/responseDemo1,会自动跳转到/responseDemo2资源

/* //1. 设置状态码为302

response.setStatus(302);

//2.设置响应头location

response.setHeader(“location”,“/day15/responseDemo2”);*/

//动态获取虚拟目录

String contextPath = request.getContextPath();

//简单的重定向方法

response.sendRedirect(contextPath+“/responseDemo2”);

//response.sendRedirect(“http://www.itcast.cn”);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request,response);

}

}

  1. 重定向的特点:redirect

① 地址栏发生变化

② 重定向可以访问其他站点(服务器)的资源

③ 重定向是两次请求。不能使用request对象来共享数据

  1. 转发的特点:forward

① 转发地址栏路径不变

② 转发只能访问当前服务器下的资源

③ 转发是一次请求,可以使用request对象来共享数据

  1. 路径写法:

  2. 路径分类

  3. 相对路径:通过相对路径不可以确定唯一资源

  • 如:./index.html

  • 不以/开头,以.开头路径

  • 规则:找到当前资源和目标资源之间的相对位置关系

  • ./:当前目录

  • …/:后退一级目录

  1. 绝对路径:通过绝对路径可以确定唯一资源
  • 如:http://localhost/day15/responseDemo2 /day15/responseDemo2

  • 以/开头的路径

  • 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出

  • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)

  • 建议虚拟目录动态获取:request.getContextPath()

  • <a> , <form> 重定向…

  • 给服务器使用:不需要加虚拟目录

  • 转发路径

② 服务器输出字符数据到浏览器

6. 步骤:

① 获取字符输出流

② 输出数据

7. 注意:乱码问题在这里插入图片描述

① PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1

② 设置该流的默认编码

③ 告诉浏览器响应体使用的编码

④ //简单的形式,设置编码,是在获取流之前设置

response.setContentType(“text/html;charset=utf-8”);

  1. 代码

package cn.itcast.web.servlet;

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  1. 重定向的特点:redirect

① 地址栏发生变化

② 重定向可以访问其他站点(服务器)的资源

③ 重定向是两次请求。不能使用request对象来共享数据

  1. 转发的特点:forward

① 转发地址栏路径不变

② 转发只能访问当前服务器下的资源

③ 转发是一次请求,可以使用request对象来共享数据

  1. 路径写法:

  2. 路径分类

  3. 相对路径:通过相对路径不可以确定唯一资源

  • 如:./index.html

  • 不以/开头,以.开头路径

  • 规则:找到当前资源和目标资源之间的相对位置关系

  • ./:当前目录

  • …/:后退一级目录

  1. 绝对路径:通过绝对路径可以确定唯一资源
  • 如:http://localhost/day15/responseDemo2 /day15/responseDemo2

  • 以/开头的路径

  • 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出

  • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)

  • 建议虚拟目录动态获取:request.getContextPath()

  • <a> , <form> 重定向…

  • 给服务器使用:不需要加虚拟目录

  • 转发路径

② 服务器输出字符数据到浏览器

6. 步骤:

① 获取字符输出流

② 输出数据

7. 注意:乱码问题在这里插入图片描述

① PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1

② 设置该流的默认编码

③ 告诉浏览器响应体使用的编码

④ //简单的形式,设置编码,是在获取流之前设置

response.setContentType(“text/html;charset=utf-8”);

  1. 代码

package cn.itcast.web.servlet;

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

[外链图片转存中…(img-2MJuDJZf-1715631641628)]

[外链图片转存中…(img-iwvaGUm7-1715631641629)]

[外链图片转存中…(img-C31rX8oz-1715631641630)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值