一.请求Request

是指 从前端浏览器 到 后端的Servlet程序 的访问过程,叫请求的过程
可以使用Servlet提供的Request对象,来解析请求中的请求参数

1.常用方法

getParamter()--按照参数名获取参数值,但是只得到一个值
getParamterValues()--按照参数名获取参数值,但是得到多个值,存入数组
setCharacterEncoding()--如果请求参数中有中文,设置字符集为utf-8
setAttribute()--设置属性
getAttribute()--获取属性

2.测试

1.创建HTML网页

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>前端提交数据,后端解析数据</title></head><body><a href="http://localhost:8090/cgb2109javaweb03_war_exploded/ServletDemo5?name=jerry&pwd=123">点我,提交get数据1</a><a href="http://localhost:8090/cgb2109javaweb03_war_exploded/ServletDemo5?hobby=篮球&hobby=足球">点我,提交get数据2</a></body>
</html>

2.创建Servlet程序,解析请求参数

package cn.tedu.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.Arrays;@WebServlet("/ServletDemo5")
public class ServletDemo5 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}//当用户以get方式提交数据时,Servlet会自动调用doGet()//get方式提交的数据,可以一个一个的解析getParameter()//也可以解析多个值getParameterValues()//如果使用的是Tomcat7.0以上的版本,get方式提交中文数据不会乱码protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {//1,request解析请求参数 name=jerry&pwd=123//1.1,获取一个值String s = request.getParameter("name");System.out.println(s);//获取name参数的值String pwd = request.getParameter("pwd");System.out.println(pwd);//获取pwd参数的值//1.2,获取到多个值String[] hobbies = request.getParameterValues("hobby");System.out.println( Arrays.toString(hobbies) );}
}

二.表单提交数据     默认get     method="post"

1.创建HTML网页文件

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><form action="http://localhost:8090/cgb2109javaweb03_war_exploded/ServletDemo6"><h3>测试 get提交数据</h3>姓名:<input type="text" placeholder="请输入姓名..." name="user"/> <br />密码:<input type="password" placeholder="请输入密码..." name="pwd"/> <br /><input type="submit" value="提交"/></form><form method="post" action="http://localhost:8090/cgb2109javaweb03_war_exploded/ServletDemo6"><h3>测试 post提交数据</h3>姓名:<input type="text" placeholder="请输入姓名..." name="user"/> <br />密码:<input type="password" placeholder="请输入密码..." name="pwd"/> <br /><input type="submit" value="提交"/></form></body>
</html>

2.创建Servlet程序,解析get/post方式提交的数据

package cn.tedu.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("/ServletDemo6")
public class ServletDemo6 extends HttpServlet {//总结1:Servlet什么时候会自动调用doPost()?什么时候会自动调用doGet()?//  Servlet会调用getMethod()来获取用户的访问方式,如果是POST会调用doPost()//  Servlet会调用getMethod()来获取用户的访问方式,如果是GET会调用doGet()//总结2:中文乱码问题?//    get方式提交数据没有乱码问题,Tomcat已经配置好了(URIEncoding="utf-8"),不必关心//    post方式提交的数据如果有中文一定乱码,request.setCharacterEncoding("utf-8");//TODO 处理post方式提交的数据--如果请求参数包含中,一定乱码!!protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//验证,请求方式是post吗?String method = request.getMethod();//指定请求的方式使用的编码--解决中文乱码request.setCharacterEncoding("utf-8");String name=request.getParameter("user");String pwd = request.getParameter("pwd");System.out.println("doPost..."+name+pwd+"..."+method);}//ServletDemo6?user=jack&pwd=123//处理get方式提交的数据:如果出现中文不会乱码,Tomcat7.0以上都处理过了protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String method = request.getMethod();String user = request.getParameter("user");//获取user的值String pwd = request.getParameter("pwd");//获取pwd的值System.out.println("doGet..."+user+pwd+"..."+method);}
}

3.模拟Servlet解析请求参数

package cn.tedu;
//模拟Servlet解析请求参数的对象Request
public class MyRequest {public static void main(String[] args) {//this是代表的本类对象,static里不能出现this,原因就是加载顺序
//        this.getParamter();MyRequest my = new MyRequest();my.getParamter();}//1,getParamter()获取每个请求参数public void getParamter(){String url="http://localhost:8090/cgb2109javaweb03_war_exploded/ServletDemo6" +"?user=jack&pwd=123" ;
//        1,按照?切割字符串,切出来两部分,存入数组//[http://localhost:8090/cgb2109javaweb03/ServletDemo6,user=jack&pwd=123]String[] strs = url.split("\\?");//转义
//        2,重点解析数组中的第二个元素,下标为1的元素String datas = strs[1];//user=jack&pwd=123
//        3,把第二步的结果,按照&切割//[user=jack,pwd=123]String[] data = datas.split("&");
//        4,遍历数组,获取每个数据for(String s : data){//遍历两次,第一次s是user=jack,第二次s是pwd=123
//        5,按照=切割,得到数组 [user,jack],只要第二个元素
//            String params = s.split("=")[1];//和下面两行等效,只是简写形式String[] ss = s.split("=");String params = ss[1];System.out.println(params);}}
}

三.综合案例

1.需求

1,准备前端HTML网页,让用户输入部门数据(编号,名称,地址)
2,准备DeptServlet,接受请求,并且解析请求参数
3,把解析成功的请求参数,进行入库
3.1,准备jar包
3.2,准备dept表(deptno,dname,loc)
3.3,准备jdbc代码,进行insert的SQL语句操作

2.创建HTML页面

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>前后端大融合</title><style>input[type='text']{width: 200px;/* 宽度*/height: 30px;/* 高度  */background-color: pink;/* 背景色 */border-color: pink;/* 边框色 */border-radius: 10px;/* 圆角边框 */}input[type="submit"]{width: 80px;/* 宽度*/height: 40px;/* 高度  */background-color: gray;/* 背景色 */border-color: gray;/* 边框色 */color: white;/* 文字的颜色 */font-size: 20px;/* 字号大小 */}</style></head><body><form method="post" action="http://localhost:8090/cgb2109javaweb03_war_exploded/DeptServlet"><h1>添加部门数据</h1><h3>编号:<input type="text" name="deptno"/></h3><h3>名称:<input type="text" name="dname"/></h3><h3>地址:<input type="text" name="loc"/></h3><input type="submit" value="保存" /></form></body>
</html>

3.创建DeptServlet类

package cn.tedu.dept;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.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;@WebServlet("/DeptServlet")
public class DeptServlet extends HttpServlet {//用户以post方式提交的数据,doPost()解析请求参数protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try{//防止中文乱码request.setCharacterEncoding("utf-8");//用来获取网页中传递来的参数,//getParameter()的参数是网页中name属性的值String a = request.getParameter("deptno");String b = request.getParameter("dname");String c = request.getParameter("loc");//TODO  jdbc--把解析到的参数入库,,insert//获取驱动Class.forName("com.mysql.jdbc.Driver");//获取连接String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";Connection con=DriverManager.getConnection(url,"root","root");//获取传输器Statement不安全低效,PreparedStatement安全防止了SQL攻击高效String sql="insert into dept values(?,?,?)";//sql骨架,?是占位符PreparedStatement p = con.prepareStatement(sql);//设置SQL的参数,执行SQLp.setObject(1,a);p.setObject(2,b);p.setObject(3,c);p.executeUpdate();//关闭资源p.close();con.close();}catch (Exception e){System.out.println("插入失败,请检查数据~");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post提交的,不能写在这里,}
}

4.总结

四.请求转发

作用是想让AServlet调用BServlet的功能.
过程: 浏览器访问AServlet ,但是AServlet偷偷调用了BServlet ,此时浏览器的地址栏没变
全程只是一次请求
实现:request.getRequsetDispather(访问BServlet的方式).forward(request,response)

1.测试

AServlet

package cn.tedu.forwardtest;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("/AServlet")
public class AServlet 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("AServlet被执行!");//实现请求转发:想让AServlet调用BServlet,本质上这是服务器的动作,浏览器没变化发现不了//要求:两个资源可以互相调用,但是要求两个资源必须在同一项目中//getRequestDispatcher()的参数是,对方的访问方式//请求转发本质上就是一次请求:在AServlet添加请求的数据,试试BServlet也能获取到就可以了request.setAttribute("name","rose");request.getRequestDispatcher("/BServlet").forward(request,response);}
}

BServlet

package cn.tedu.forwardtest;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("/BServlet")
public class BServlet 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("BServlet被执行!");//获取在AServlet中存入的数据,其实就是根据key获取valueObject data = request.getAttribute("name");System.out.println(data);}
}

2.总结

直接访问AServlet,背后的BServlet也会被执行,并且浏览器没变化.

五. 响应Response

是指 从java程序组织好的数据 发送给 前端浏览器 的过程,叫响应

1.常用方法

getwriter()---给浏览器响应数据
setContentType()---用来解决防止响应时的中文乱码
senRedirect()--重定向

2.测试

package cn.tedu.response;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("/ResponseServlet")
public class ResponseServlet extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {//3,如果想要响应中文,防止中文乱码response.setContentType("text/html;charset=utf-8");//1,获取写出流PrintWriter out = response.getWriter();//2,正式写出数据--写到浏览器out.write("hello servlet1~~~");out.write("hello servlet2~~~");out.write("hello servlet3~~~");out.write("你好servlet~~~");//中文乱码啦~}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

六.重定向

1, 整个过程有 两个请求 两个响应
2, 地址栏会发生改变
使用: response.sendRedirect(对方的访问方式)
此时,你想访问哪个程序都可以

1.测试

ServletA

package cn.tedu.redirect;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("/ServletA")
public class ServletA extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//面试题:重定向和请求转发的区别???//1,请求转发是请求request的功能,全程1次请求1次响应,地址栏不变//request.getRequestDispather("目标访问的方式").forward(请求,响应)//2,重定向是response的功能,全程2次请求2次响应,地址栏改变//response.sendRedirect("目标访问的方式")response.sendRedirect("https://www.baidu.com/");}
}

ServletB

package cn.tedu.redirect;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("/ServletB")
public class ServletB extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

七.优化MyRequest类

package cn.tedu;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;//模拟Servlet解析请求参数的对象Request
public class MyRequest {public static void main(String[] args) {//this是代表的本类对象,static里不能出现this,原因就是加载顺序
//        this.getParamter();MyRequest my = new MyRequest();//查询指定参数名对应的值String u = my.getParamter("pwd");System.out.println(u);}//1,getParamter()获取每个请求参数public String getParamter(String keyword){String url="http://localhost:8090/cgb2109javaweb03_war_exploded/ServletDemo6" +"?user=jack&pwd=123" ;String[] data = url.split("\\?")[1].split("&");//Map存数据有特性,数据必须以键值对的形式存在,可以根据key找valueMap<String,String> map = new HashMap<>();//{pwd=123, user=jack}
//        4,遍历数组,获取每个数据for(String s : data){//遍历两次,第一次s是user=jack,第二次s是pwd=123
//        5,按照=切割,得到数组 [user,jack],只要第二个元素String[] ss = s.split("=");String value = ss[1];String key = ss[0];map.put(key,value);//存入map}return map.get(keyword);//去map里找key对应的value,{pwd=123, user=jack}}
}

八.Filter过滤器

用来过滤请求或者响应
当A请求B时,可以在中间添加一个过滤器
当A给B做出响应时,可以在中间添加一个过滤器

1.使用步骤

1, 创建类,implements Filter接口
2, 重写抽象方法doFilter
3, 能否触发过滤器

2.创建过滤器

package cn.tedu.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//创建过滤器:implements Filter+重写抽象方法
@WebFilter("/*")//拦截所有请求
public class Filter1 implements Filter {//销毁,执行1次public void destroy() {}//类似于Servlet的service(),会被执行多次public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("过滤器开始执行任务~~");chain.doFilter(req, resp);//放行,解除阻塞状态}//初始化,执行1次public void init(FilterConfig config) throws ServletException {}
}

3.测试

直接浏览器访问Servlet就可以触发过滤器的规则

4.Filter生命周期

package cn.tedu.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//创建过滤器:implements Filter+重写抽象方法
@WebFilter("/*")//拦截所有请求
public class Filter1 implements Filter {//第三阶段,销毁阶段,Filter会自动调用destroy(),只会执行1次public void destroy() {System.out.println("filter被销毁~~~");}//第二阶段,类似于Servlet的service()服务阶段,会被Filter执行多次public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("过滤器开始执行任务~~");chain.doFilter(req, resp);//放行,继续访问目标资源,否则目标资源无法执行}//第一阶段,初始化阶段,Filter会自动调用init(),只会执行1次public void init(FilterConfig config) throws ServletException {System.out.println("filter被初始化完成~~~");}
}

5.测试

​​​​​​​

6.过滤器的匹配规则

​​​​​​​

前后端整合+Request(请求转发)+respon(重定向)+get+post+Filter过滤器相关推荐

  1. Request请求转发和重定向

    Request请求转发和重定向 一,Request请求转发 (一),请求转发:在服务器内部的资源跳转的方式 我们在实际开发中,需要写不同的servlet,每个人servlet完成不同的功能,当我们访问 ...

  2. 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等

    文章目录 一.Servlet 概述 二.Servlet HelloWorld 三.Servlet 继承关系 四.Servlet 生命周期 五.ServletConfig 和 ServletContex ...

  3. 【Java web】请求转发响应重定向

    文章目录 简介 请求转发 响应重定向 使用时机 简介 请求转发和响应重定向是Java web中两种资源跳转的方式.简单来说,对于完成一次请求需要许多特定的资源(如已经写好的页面或另一个Servlet) ...

  4. 浅析请求转发和重定向

    浅析请求转发和重定向 1.请求转发 request.getRequestDispather("/indexServlet").forword(request,response); ...

  5. 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆

    三天自动登陆项目源码:GitHub地址-LoginSystem JDBC 手写SORM框架 手写Servlet 开发环境:Eclipse 一.请求乱码问题解决 // 设置请求.响应编码格式req.se ...

  6. 【JavaWeb】Response请求转发与重定向辨析

    请求转发与重定向对比 辨析 请求转发只有一次请求.一次响应,是在服务端内部跳转 重定向有两次请求.两次响应:将结果返回给客户端,让客户端重新发起一次跳转 请求转发的登陆界面实现 login.jsp & ...

  7. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...

    原文地址:ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段 ServletRequest 基本概念 ...

  8. 请求转发与重定向的区别和执行流程

    请求转发与重定向的区别和执行流程 文章目录 请求转发与重定向的区别和执行流程 1 请求转发与重定向区别 2 现实生活的例子 2.1 重定向 2.2 请求转发 3 重定向-流程图.代码.结果 3.1 流 ...

  9. 【Servlet】请求转发与重定向

    重定向 重定向是指由原请求地址重新定位到某个新地址,原有的request请求失效,客户端看到的是新的request请求返回的响应结果,客户端浏览器地址栏变为新请求地址. 一次重定向过程存在两次请求和两 ...

最新文章

  1. python对应位置相乘
  2. ASP.NET中Image控件不能自动刷新
  3. 全面布局大数据平台,银科控股签约神策数据
  4. 中国高性能计算机TOP100出炉 曙光联想并列第一
  5. HMAC-SHA1加密
  6. git设置master权限_git怎么控制成员的权限?
  7. URLEncoder.encode问题
  8. 中南大学c语言试题期末考试,2011年中南大学C语言期末试题卷A
  9. 矩池云课程版使用教程
  10. row_number()over函数的使用(转)
  11. web网站嵌入QQ临时会话代码 ----转载----小技巧
  12. 微波存在感应雷达,人体存在感应雷达模块,物联网智能赋能应用
  13. Emoji 映射编码
  14. 程序员的一天:硅谷女程序员 mayuko
  15. 协议:GRE;collisions
  16. 生活是否永远如此艰辛,还是仅仅童年才如此
  17. Effective_STL 学习笔记(三十一) 了解你的排序选择
  18. 软件设计七大设计原则
  19. orgchart组织机构图
  20. No.1 STM32F429IGT6开发板简介 (STM32F429/F767/H743)

热门文章

  1. 为什么说每个软件工程师,都该懂大数据技术?
  2. 【Proteus仿真】51单片机+直流电机PWM调速实验
  3. 计算机考研一志愿不满,【建议收藏】40所不歧视本科 保护一志愿院校 内含大量985/211!...
  4. 服务器ahci模式安装系统,u盘装系统硬盘模式怎么设置|u盘装系统BIOS设置ide/ahci方法...
  5. matlab m序列扩频,基于matlab的移位寄存器法m序列的产生
  6. C/C++学习笔记——C基础:C语言概述
  7. sql server 系统表 介绍
  8. 人体红外传感器+蜂鸣器实现人体红外报警
  9. Android时间与服务器同步方案
  10. 插画构图如何学习,小白必看