100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 前后端整合+Request(请求转发)+respon(重定向)+get+post+Filter过滤器

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

时间:2023-12-31 20:19:57

相关推荐

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

一.请求Request

是指 从前端浏览器 到 后端的Servlet程序 的访问过程,叫请求的过程

可以使用Servlet提供的Request对象,来解析请求中的请求参数

1.常用方法

getParamter()--按照参数名获取参数值,但是只得到一个值getParamterValues()--按照参数名获取参数值,但是得到多个值,存入数组setCharacterEncoding()--如果请求参数中有中文,设置字符集为utf-8setAttribute()--设置属性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解析请求参数的对象Requestpublic 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("/");}}

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解析请求参数的对象Requestpublic 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.过滤器的匹配规则

​​​​​​​

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。