web开发,过滤器,前后端交互

news2024/9/22 9:54:48

目录

web开发概述

web开发环境搭建

Servlet概述

Servlet的作用:

Servlet创建和使用

Servlet生命周期

http请求

过滤器

过滤器的使用场景:

通过Filter接口来实现:

前后端项目之间的交互:

1、同步请求

2、异步请求

优化版:

json (javaScript object Notation)


web开发概述

所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互.

Web服务器是指驻留于因特网上某种类型计算机的程序。

可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览; 它是一个容器,是一个连接用户与程序之间的中间件。

WEB服务器有很多,流行的WEB服务器有Tomcat 、 WebSphere 、 WebLogic、Jboss等。

在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器: Apache 的Tomcat,该服务器支持全部JSP以及Servlet规范。

web开发环境搭建

1、从官方网站 http://tomcat.apache.org 获取Tomcat安装程序包。

2、安装JDK

● 设置JAVA_HOME环境变量

● 设置PATH环境变量

3、安装Tomcat

server.xml是Tomcat的主配置文件,提供Tomcat组件的初始配置,tomcat启动的时候执行这些初始化设置。其次要修改服务器端口号

Servlet概述

Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序.它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet方法。

Servlet的作用:

1.接收用户发送的请求数据

2.调用其他的java程序来处理请求

3.根据处理结果,将结果响应给客户端

Servlet创建和使用

1.创建一个类继承javax.servlet.http包下的HttpServlet

2.在web.xml文件中配置Servlet

3.运行Servlet程序

可通过浏览器访问http:localhost:8080/ 项目名/配置的url

Servlet生命周期

package com.ffyc.dromServer.web;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

/*
创建javaEEc 程序
     创建一个类  继承HttpServlet,这个类就是一个javaEE程序
     在web.xml文件配置,问外提供一个访问地址,就可以在浏览器中访问,找到对应javaEE程序
 */
public class DemoServlet extends HttpServlet{
    /*
       无参构造方法,默认是存在,初始化创建的对象
       只被调用一次(始终只创就了一个对象),在第一次访问servlet程序由服务器创建执行
     */
    public DemoServlet() {
        System.out.println("无参构造方法");
    }

    /*
    service() 用来接收前瑞请求,为前瑞提供服务的
    每次前端发送的请求,都会调用service(),多次调用
    HttpServletRequest req: 表示请求对象,前端提交过所有的数据,都有服务器封装在此对象中(服务器将请求到数据都封装到HttpServletRequest对象中)
    HttpServletResponse resp:表示响应对象,用来向前端响应数据(就可以获得请求中的任意的数据)
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("service");
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
/*
init() 初始化  在构造方法执行完成后,文即被调用执行
       完成一些servlet程序的初始化( 例知,该取配置文件中参数)
       只执行一次
 */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init"+config.getInitParameter("count"));
    }

}

http请求

当客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求。

请求包括:请求行,请求头,请求体 

从前端向后端发送的请求,都是http请求。
http请求只能发送:超文本内容。
一次http请求中包含请求行,请求头,请求体三部分。
请求行:请求的方式,请求的资源地址等等。
请求头:包含客户端的一些环境信息,这些信息都是由浏览器自动发送的,以键值形式传递。
请求体:以表单post方式向后端发送的请求数据,在请求体中包含。
            

get请求:
             get请求主要是从后端获取信息的。例如网页上的超连接,向后端传递少量信息,获得大量信息。
              请求数据在请求地址中直接拼接,所以传输的数据量是有限的,并且敏感,数据不安全。
                   
post请求:
               post请求主要用于向后端发送大量数据。
               请求数据在请求体中,可以传输大量数据, 不会在地址中显示,所以相对安全。

<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<!-- get请求 -->
		<a href="http://127.0.0.1:8088/dromServer/login?name=张三&age=11">登陆</a>
		<!-- post请求 -->
		<form action="http://127.0.0.1:8088/dromServer/login" method="post">
			账户:<input type="text" name="account" value=""/><br />
			密码:<input type="password" name="password" value=""/><br />
			<input type="submit" value="登陆"/>
		</form>
		<!-- <form action="http://127.0.0.1:8088/dromServer/login" method="get">
			姓名:<input type="text" name="name" value=""/><br />
			年纪:<input type="text" name="age" value=""/><br />
		</form> -->
		
	</body>
</html>

由于前端请求有get和post两种,在后端的处理上略有不同, 所以在父类的service方法中,会根据请求方式的不同,调用doget或者dopost方法分别处理. 

package com.ffyc.dromServer.web;

import com.ffyc.dromServer.dao.LoginDao;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

public class LoginServlet extends HttpServlet {

//init()在没有需要初始化操作时,可以不用重写,但是服务器会调用父类中的init()
//    @Override
//    public void init(ServletConfig config) throws ServletException {
//        super.init(config);
//    }
/*
    destroy()在没有最终执行的一些操作时,也可以不用重写,但是服务器会调用父类中destroy()
    @Override
    public void destroy() {
        super.destroy();
    }

    /*
       处理get请求
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name=req.getParameter("name");
        String age=req.getParameter("age");
        System.out.println(name);
        System.out.println(age);
    }

    /*
       处理post请求
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收数据post请求中文会乱码
        //设置(请求)解码的编码格式
        req.setCharacterEncoding("utf-8");
        //获取请求中我们自己提交的数据
        String account=req.getParameter("account");
        String password=req.getParameter("password");
        System.out.println(account);
        System.out.println(password);

        //调用jdbc与数据库交互
        LoginDao loginDao=new LoginDao();
        //相应
        //设置响应内容编码格式
        resp.setContentType("text/html;charset=utf-8");
        //获得打印输出字符流
        PrintWriter printWriter= resp.getWriter();
        try{
            boolean res= loginDao.login(account,password);
            if(res){
                printWriter.write("登陆成功!");
            }else {
                printWriter.write("账号或密码错误!");
            }
        }catch (Exception throwables){
            throwables.printStackTrace();
            printWriter.write("服务器忙,稍后再试!");
        }
    }
}

请求和响应是Web交互最基本的模式,在Servlet中,用HttpServletRequest来表示请求。

服务器就是一款软件,可以向其发送请求,服务器会做出一个响应。

可以在服务器中部署文件,让他人访问。

也可以把运行服务器软件的计算机也可以称为服务器.

 一次请求发起到服务器,servlet程序,到最终doget/dpost的请求流程图

过滤器

过滤器是javaEE规范中定义的一种技术,可以让请求到达目标servlet之前,先进入到过滤器中,在过滤器中统一进行一些拦截处理。

当处理完成之后,可以继续向后执行,如果配置了多个过滤器,也可以进入到下一个过滤器。

过滤器作用:
过滤器用来实现通用的功能,减少代码几余,提高可维护性。
一个过滤器可以配置给多个资源使用。
一个资源也可以配置多个过滤器,按照配置顺序调用。

过滤器的使用场景:

1、统一编码过滤

2、权限验证

3、跨域过滤

Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源

通过Filter接口来实现:

public class EncodFilter implements Filter {
    String reqencod="";
    String respencod="";

    //在init方法中FilterConfig获得配置文件的初始化参数
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        reqencod=filterConfig.getInitParameter("reqencod");//getInitParameter(String name),该方法用来获得过滤器的初始化参数值。
        respencod=filterConfig.getInitParameter("respencod");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("编码过滤器");
        servletRequest.setCharacterEncoding(reqencod);//设置请求数据编码格式
        servletResponse.setContentType(respencod);//设置响应内容编码格式
        filterChain.doFilter(servletRequest,servletResponse);//让请求;离开过滤器,往下步进行
    }
}

前后端项目之间的交互:

1、同步请求

      指一次只能做一件事情,当网页与后端交互时,前端不能在进行其他操作。

这种请求方式,在前后端交互时不太友好。因此逐渐被淘汰。

  服务器响应回来的内容,会把整个浏览器中的内容覆盖掉。

2、异步请求

不同步,异步请求时会出现跨域访问,浏览器不允许js对象接收来自其他服务器相应的内容。

同时可以做多件事情(前端与服务器交互时,不影响前端网页其他操作)。

使用js中提供的 XMLHttpRequest对象实现发送异步请求,和接收服务器响应。

跨域访问是一个前端问题,也可以在后端解决。

跨域问题:

不同服务之间进行访问

只要请求协议,域名,端口其中一项不同,就属于跨域访问。

在后端过滤器中响应时,告知前端本次响应是安全的,可以正常接收。

<script>
			function checkAccount(account) {
				//同步请求,已经被抛弃了
				//location.href="http://127.0.0.1:8088/dromServer/reg?account="+account;
				//异步请求,使用js对象发送请求
				var httpobj = new XMLHttpRequest();
				//封装请求地址和数据
				httpobj.open("get", "http://127.0.0.1:8088/dromServer/reg?account=" + account);
				//发送请求
				httpobj.send();
				//接收响应
				httpobj.onreadystatechange = function() {
					document.getElementById("magid").innerHTML = httpobj.responseText;
				}
			}
		</script>

优化版:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- 导入axios框架 -->
		<script src="js/axios.min.js"></script>
		<script>
			function checkAccount(account){
				//axios框架对异步请求进行封装
				axios.get("http://127.0.0.1:8088/dromServer/reg?account=" + account).then((resp) => {
					document.getElementById("magid").innerHTML = resp.data; //resp.data取出后端响应的内容
				});
			}
		</script>
	</head>
	<body>
		账号:<input type="text" name="account" value="" onblur="checkAccount(this.value)" />
		<span id="magid"></span>
		<br />
		密码:<input type="password" name="password" value="" /> <br />
		<input type="submit" value="登录" />
	</body>
</html>

当后端向前端响应更多的数据时,后端一般情况下将数据封装到对象中,但是js不认识java对象。

java中toString方法可以将对象转为字符串,js接收,接收到后只是普通的字符串,不能使用面向对象方式操作。

为了让js能够方便的进行操作,在java中将对象转为json格式的字符串,传递给前端js。

json (javaScript object Notation)

 javaScript 对象表现形式是一种js对象表示方式的字符串。JavaScript 对象表示法 {name:jim,age:10}

两种不同的语言之间如何进行数据交互?(例如c语言程序 和 java程序之间要进行数据交互)

json是一种公认的js识别的对象表示方式,对于java而言就是一种特定格式的字符串。

目前json格式 已成为公认的前后端交互的数据标准格式。

PrintWriter writer=resp.getWriter();
String jsonstr =new ObjectMapper().writeValueAsString(student);
writer.print(jsonstr);//打印响应一个学生对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用telnet发送QQ邮箱的电子邮件时遇到的问题(2024最新)

问题1&#xff1a;即使在控制面板启用telnet客户端也无法使用telnet 解决&#xff1a;使用管理员权限打开cmd&#xff0c;执行命令&#xff1a;dism /online /Enable-Feature /FeatureName:TelnetClient&#xff0c;之后根据弹出信息键入Y重启即可 参考链接&#xff1a;https:…

开源新宠:RAG2SQL工具,超越Text2SQL的7K Star之作

查询数据库离不开SQL&#xff0c;那如何快速构建符合自己期望的SQL呢&#xff1f;AI发展带来了Text2SQL的能力&#xff0c;众多产品纷纷提供了很好的支持。 今天我们分享一个开源项目&#xff0c;它在Text2SQL的基础上还要继续提高&#xff0c;通过加入RAG的能力进一步增强&am…

虹软科技25届校招笔试算法 A卷

目录 1. 第一题2. 第二题3. 论述题 ⏰ 时间&#xff1a;2024/08/18 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷分为不定项选择&#xff0c;编程题&#xff0c;必做论述题和选做论述题&#xff0c;这里只展示编程题和必做论述题&#xff0c;一共三…

代码随想录算法训练营_day17

题目信息 654. 最大二叉树 题目链接: https://leetcode.cn/problems/maximum-binary-tree/题目描述: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前…

AVI-Talking——能通过语音生成很自然的 3D 说话面孔

概述 论文地址&#xff1a;https://arxiv.org/pdf/2402.16124v1.pdf 逼真的人脸三维动画在娱乐业中至关重要&#xff0c;包括数字人物动画、电影视觉配音和虚拟化身的创建。以往的研究曾试图建立动态头部姿势与音频节奏之间的关联模型&#xff0c;或使用情感标签或视频剪辑作…

【数据结构与算法】如何构建最小堆

最小堆的定义 最小堆&#xff0c;作为一种独特且重要的数据结构&#xff0c;它是一种特殊的二叉树。在这种二叉树中&#xff0c;有一个关键的规则&#xff1a;每一个父节点所存储的值&#xff0c;都必然小于或者等于其对应的子节点的值。这一规则确保了根节点总是承载着整个堆…

机器学习(3)-- 一元线性回归

文章目录 线性回归训练模型测试模型线性回归方程测试实用性 总结 线性回归 线性回归算法是一种用于预测一个或多个自变量&#xff08;解释变量&#xff09;与因变量&#xff08;响应变量&#xff09;之间关系的统计方法。这种方法基于线性假设&#xff0c;即因变量是自变量的线…

【学习笔记】Day 16-17

一、进度概述 1、ddnet_main 相关代码学习&#xff08;预计 3-4 天&#xff09; 二、详情 1、顶层结构 关于代码顶层结构的一些思考和总结&#xff0c;其中下图为师兄代码的文件结构 总结&#xff1a; 对于一个优秀的代码&#xff0c;其文件结构一定也是清晰的&#…

随笔五、开发板连接WIFI并通过SSH连接泰山派

摘要&#xff1a;通过wifi连接内网&#xff0c;电脑通过SSH连接泰山派 1. 泰山派接入WIFI 泰山派开发板SDK已经集成wifi_start.sh脚本&#xff0c;在脚本后面直接输入wifi名字和密码就能连接wifi rootRK356X:/# wifi_start.sh wifi名字 wifi密码 查看ip地址&#xff0c;wlan0就…

洛谷 P6359 [CEOI2018] Cloud computing

题目本质&#xff1a;贪心01背包&#xff08;dp&#xff09; 题目思路&#xff1a;dp[i][j] 表示考虑前 i 台计算机&#xff0c;能够获得 j 个核心时&#xff0c;所能获得的最大价值。将其可以优化为dp[i] 表示能够获得 i 个核心时&#xff0c;所能获得的最大价值。 状态转移…

jira敏捷开发管理工具视频教程Confluence工作流协同开发(2024)

正文&#xff1a; 随着Jira敏捷开发方法论的普及&#xff0c;Jira已经成为全球软件开发团队管理项目、任务和问题的首选工具。为了帮助团队更好地掌握Jira的核心功能&#xff0c;精心准备了一套全面开发技术及案例视频教程——《Jira敏捷开发管理工具视频教程Confluenc…

学习大数据DAY38 hive 安装与配置

目录 hadoop 大数据平台-hive 组件部署介绍 hadoop 大数据平台-Hive 部署步骤 教学视频 上机作业 hadoop 大数据平台-hive 组件部署介绍 metastore:保存关于表、列、分区、数据格式、存储位置等各种元数据信 Driver:负责与 Hive 服务器建立网络连接&#xff0c;使客户端能…

Unity的动画系统

目录 Unity动画系统的最新更新和改进有哪些&#xff1f; 如何在Unity中高效地使用Animator组件进行复杂动画制作&#xff1f; Unity动画系统中的动画混合和分层功能是如何工作的&#xff1f; 动画混合&#xff08; blend tree&#xff09; 动画分层 在Unity中创建和管理动…

一键运行RocketMQ5.3和Dashboard

一键运行RocketMQ5.3和Dashboard 目录 一键运行RocketMQ5.3和Dashboard通过Docker Compose 来一键启动运行的容器包括docker-compose.yml文件运行命令启动本地效果查看 参考信息 通过Docker Compose 来一键启动 运行的容器包括 NameServerBrokerProxyDashBoard docker-compo…

RabbitMQ消息队列总结(❤❤❤❤❤)

RabbitMQ那些事 参考一. `RabbitMQ`介绍1.1 Java工程师1.1.1 RabbitMQ学习目标1.1.2 消息队列介绍1.1.3 RabbitMQ介绍各自属性介绍(❤❤❤)二. `RabbitMQ`安装1. 基于Linux1.1 安装1.2 常用命令1.3 后台管理开启与面板介绍三. 客户端`SDK`操作(❤❤了解)1. 客户端依赖2. 生产者…

微信消息防撤回插件

该软件可以恢复别人撤回的消息。 版本特色&#xff1a; 1、看到对方撤回的消息 2、多账号可正常登录 修改原理&#xff0c;如下图&#xff1a; 使用说明&#xff1a; 1、需电脑登录 2、解压后&#xff0c;双击start_wechat.bat来运行软件 下载地址&#xff1a;Wechat防撤…

UE基础 —— 资产和内容包

目录 直接导入资产 使用资产 创建资产 资产引用 管理资产 移动和复制资产 删除资产 导出资产 迁移资产 资产元数据 在虚幻编辑器UI中使用元数据 使用资产元数据 自动重新导入 查找资产引用 替换引用工具 Class Viewer 全局资产选取器 Property Matrix 引擎项…

以node / link文件表征的道路网络-----基于南京公路公开数据做路径规划(下)------dijkstra算法的一些简单花样

在不改变dijkstra算法本身的情况下&#xff0c;完全可以从数据源的角度出发&#xff0c;解决我们的一些简单需求&#xff1a; 比较初级且粗暴的玩法&#xff0c;可以是强行赋予一些link极端的路段长度。 对于我们坚决不希望车辆行驶的道路、禁行区、或是危险区&#xff0c;就…

局域网基础技术详解

虽然在学校学了计算机网络&#xff0c;但还是有些东西要自己去了解。所以这篇博客也算是学校课程和我在网上查找资料总结的一些关于局域网基础技术知识。 一、傻瓜式交换机 一种即插即用、未管理的交换机&#xff0c;不需人工配置的低端交换机。只提供基本的网络连接功能&#…

koa+puppeteer爬虫实践

最近工作中遇到一个使用nodejs实现爬虫程序的任务。需求背景是这样的&#xff1a;公司运营的一个老项目运营那边最近提了SEO优化的需求&#xff0c;但是项目本身并没有做SSR(服务端渲染)&#xff0c;公司的要求是花费的人力成本最低&#xff0c;代价最小。在经过一番调研之后团…