Servlet_Web小结

1.web开发概述

什么是服务器?

解释一:服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.
可以在服务器中部署文件,让他人访问

解释二:也可以把运行服务器软件的计算机也可以称为服务器。

web开发: 指的是从网页中向后端程序发送请求 , 与后端程序进行
交互 .
流程图如下 :
Web服务器是指驻留于因特网上某种类型计算机的程序。
可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界
浏览; 它是一个容器,是一个连接用户与程序之间的中间件。
WEB服务器有很多,流行的WEB服务器有Tomcat 、 WebSphere 、
WebLogic、Jboss等

2.web开发环境搭建

Tomcat官方站点:http://tomcat.apache.org

1.获取Tomcat安装程序包:

tar.gz文件是Linux操作系统下的安装版本
zip文件是Windows系统下的压缩版本

2.安装JDK

  设置JAVA_HOME环境变量
设置PATH环境变量
安装Tomcat
解压tomcat压缩文件
Tomcat 的目录层次结构
双击 bin 目录下的 startup.bat 文件(出现下图,说明已经安装成功,若错误,得重新配置环境变量)
输入 http://localhost:端口号(打开conf文件,修改server.xml文件,打开Notepad++可以修改端口号)
或http:127.0.0.1:端口号
或局域网ip:端口号

3.创建并发web项目

1.创建javaWeb项目
2.发布web应用到服务器
自动将web应用发布到web服务器下,需要在开发工具中集成tomcat进来
结果

3.Servlet

1.概述

Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序.
它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用
Servlet方法。
Servlet的作用:
1.接收用户发送的请求数据
2.调用其他的java程序来处理请求
3.根据处理结果,将结果响应给客户端

2.Servlet创建和使用

1.创建一个类继承javax.servlet.http包下的HttpServlet
2.在web.xml文件中配置Servlet
代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--
    .xml文件:ml结尾的,也是一种标记语言,设计的目的是用来在项目中存储配置信息的,制定好就可以使用那些标签即可
    web.xml文件:存储web后端的配置信息,在服务器启动时,由服务器加载读取的,
    -->


    <!--配置servlet程序 把我们开发的servlet程序注册到服务器,有服务器启动时加载,在第一次访问时,由服务器创建对象,-->
    <servlet>

        <servlet-name>demo</servlet-name>
        <servlet-class>com.ffyc.dormServer.web.DemoServlet</servlet-class>
<init-param><!-- 向servlet中配置一些参数-->
    <param-name>count</param-name>
    <param-value>10</param-value>
</init-param>
    </servlet>
    <!--为servlet配置一个访问地址-->
    <servlet-mapping>
        <servlet-name>demo</servlet-name><!--为指定name的servlet程序配置访问地址-->
        <url-pattern>/demo</url-pattern><!--配置的供外界访问的地址 必须以/开头-->
    </servlet-mapping>
    <!--注册登录处理的servlet程序-->
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.ffyc.dormServer.web.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>
3.运行Servlet程序
通过浏览器访问 http:localhost:8080/ 项目名 / 配置的 url
web端:
后端:

3.Servlet对象生命周期

创建(实例化):
第一访问Servlet程序时,由服务器创建

初始化:
在构造方法执行完成后,调用init()执行一些初始化操作

服务:
每次请求调用service()

销毁:服务器关闭时,会销毁servlet对象,
并且在销毁servlet对象时,会自动调用destroy(),执行一些最终操作。

执行代码:(及注意事项)

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    //无参构造默认是存在
    /*init()方法在没有需要初始化操作时可以不用重写,但是服务器会调用父类中的init()*/
   /* @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }*/


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行登录处理");
    }
//destroy()在没有最终执行的一些操作时,也可以不用重写,但是服务器会调用父类中的destroy()
    /*@Override
    public void destroy() {
        super.destroy();
    }*/
}

4.HTTP协议

1.http请求概述

http请求?
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器
发送了一个http请求。
请求包括:
请求行,请求头,请求体 .
请求行:请求的方式,请求资源名称
请求头:包含客户端的一些环境信息,这些信息都是由浏览器自动发送的,以键值对形式传递
请求体:以表单post方式向后端发送的请求数据,在请求体中包含请求体代表着浏览器在post请求方式中传递给服务器的参数,请求体中参数以键值形式传递,多个用&链接,服务器接收到后再解析.
例如:username=admin&userpwd=123
get请求:
 get请求主要是从后端获取信息,例如网页上的超链接,向后端传递少量信息,获得大量信息。
 请求数据在请求地址中直接拼接,所以传输的数据量有限的,并且敏感数据不安全。
 
 post请求:主要用于向后端发送大量数据,请求数据在请求体中,可以传输大量数据,不会在地址中显示,所以相对安全。
Get方式与post方式的区别
  Get方式主要是从服务器获取信息;post主要是想服务器提交信息
  Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据
放置在请求体中提交。
  GET方式提交的数据大小受限制一般1kb(不同浏览器也会有不同);而
POST则没有此限制

2.简单的交互代码

web前端

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
      <a href=" http://127.0.0.1:8008/dormServer/login?account=1111&&password=2222">登录</a>
        <form action="http://127.0.0.1:8008/dormServer/login" method="post">
        账号:<input  type="text" name="account" value=""/><br/>
        密码:<input type="password" name="password" value=""/><br/>
        <input type="submit" value="登录"/>
        </form>
    </body>
</html>

点击登录按钮,向后端提交你输入的账号和密码。

浏览器的网络断端检测到的对login发送的信息,及请求类型POST

web后端

package com.ffyc.dormServer.web;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
   
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行登录处理");
        //接受前端提交的数据
        String account=req.getParameter("account");
        String password=req.getParameter("password");
        System.out.println(account);
        System.out.println(password);
    }

}

后端显示前端输入的账号和密码。

由于前端请求有get 和post两种,在后端的处理略有不同,所以在父类的方法中,会根据请求方式的不同,会调用doGet或者doPost方法,分别处理。
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
  


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

        req.setCharacterEncoding("utf-8");//设置解码的编码格式
        System.out.println("doPost()");
        String account=req.getParameter("account");
        String password=req.getParameter("password");
        System.out.println(account);
        System.out.println(password);
    }
    //destroy()在没有最终执行的一些操作时,也可以不用重写,但是服务器会调用父类中的destroy()
    /*@Override
    public void destroy() {
        super.destroy();
    }*/
   
}

3.Http请求的常用方法

System.out.println(req.getMethod());//获取请求方式
System.out.println(req.getProtocol());//获取请求协议
System.out.println(req.getServerName());//获得服务名/可以是ip,也可以是域名
System.out.println(req.getServerPort());//获得服务端口号
System.out.println(req.getRemoteAddr());//获得客户端ip
System.out.println(req.getRemotePort());//获得客户端端口
System.out.println(req.getHeader("User-Agent"));//获得客户机信息
System.out.println(req.getHeader("Accept-Language"));
req.setCharacterEncoding("utf-8");//设置解码的编码格式

实验代码:

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

public class LoginServlet extends HttpServlet {
 
/*用来处理get请求*/
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //接受我们自己向后端发送的数据
        System.out.println("doGet()");
        String name=req.getParameter("name");
        String age=req.getParameter("age");
        Integer.parseInt(age);
        System.out.println(name);
        System.out.println(age);
        //接收请求行和请求头的数据。
        System.out.println(req.getMethod());//获取请求方式
        System.out.println(req.getProtocol());//获取请求协议
        System.out.println(req.getServerName());//获得服务名/可以是ip,也可以是域名
        System.out.println(req.getServerPort());//获得服务端口号
        System.out.println("====================");
        System.out.println(req.getRemoteAddr());//获得客户端ip
        System.out.println(req.getRemotePort());//获得客户端端口
        System.out.println(req.getHeader("User-Agent"));//获得客户机信息
        System.out.println(req.getHeader("Accept-Language"));
    }


}

运行结果:

4.Http响应

代码:

import javax.servlet.ServletConfig;
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;

public class LoginServlet extends HttpServlet {
   
   @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行登录处理");
        //接受前端提交的数据
        String account=req.getParameter("account");
        String password=req.getParameter("password");
        System.out.println(account);
        System.out.println(password);
    }
*/
/*用来处理get请求*/
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //接受我们自己向后端发送的数据
        System.out.println("doGet()");
        String name=req.getParameter("name");
        String age=req.getParameter("age");
        Integer.parseInt(age);
        System.out.println(name);
        System.out.println(age);
        //接收请求行和请求头的数据。
        System.out.println(req.getMethod());//获取请求方式
        System.out.println(req.getProtocol());//获取请求协议
        System.out.println(req.getServerName());//获得服务名/可以是ip,也可以是域名
        System.out.println(req.getServerPort());//获得服务端口号
        System.out.println("====================");
        System.out.println(req.getRemoteAddr());//获得客户端ip
        System.out.println(req.getRemotePort());//获得客户端端口
        System.out.println(req.getHeader("User-Agent"));//获得客户机信息
        System.out.println(req.getHeader("Accept-Language"));
    }
/*用来处理post请求*/
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");//设置解码的编码格式
        System.out.println("doPost()");
        String account=req.getParameter("account");
        String password=req.getParameter("password");
        System.out.println(account);
        System.out.println(password);
        //调用jdbc与数据库交互

        //作出响应。
        //设置响应内容编码格式
        /*resp.setHeader("content-type", "text/html;charset=utf-8");*/
        resp.setContentType("text/html;charset=utf-8");//设置响应内容编码格式
        PrintWriter printWriter=resp.getWriter();//获得打印输出字符流
        printWriter.write("<h2>登录成功</h2>");
    }
    //destroy()在没有最终执行的一些操作时,也可以不用重写,但是服务器会调用父类中的destroy()
    /*@Override
    public void destroy() {
        super.destroy();
    }*/

}

运行结果:


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++学习全教程(Day2)

一、数组 在程序中为了处理方便,常常需要把具有相同类型的数据对象按有序的形式排列起来&#xff0c;形成“一组”数据&#xff0c;这就是“数组”(array&#xff09; 数组中的数据&#xff0c;在内存中是连续存放的&#xff0c;每个元素占据相同大小的空间&#xff0c;就像排…

redis实战-添加商户缓存

为什么要使用缓存 言简意赅&#xff1a;速度快&#xff0c;好用缓存数据存储于代码中&#xff0c;而代码运行在内存中&#xff0c;内存的读写性能远高于磁盘&#xff0c;缓存可以大大降低用户访问并发量带来的服务器读写压力实际开发中&#xff0c;企业的数据量&#xff0c;少…

网络编程常见问题

1、TCP状态迁移图 2、TCP三次握手过程 2.1、握手流程 1、TCP服务器进程先创建传输控制块TCB&#xff0c;时刻准备接受客户进程的连接请求&#xff0c;此时服务器就进入了LISTEN&#xff08;监听&#xff09;状态&#xff1b; 2、TCP客户进程也是先创建传输控制块TCB&#xff…

RabbitMq教程【精细版一】

一、引言 模块之间的耦合度过高&#xff0c;导致一个模块宕机后&#xff0c;全部功能都不能用了&#xff0c;并且同步通讯的成本过高&#xff0c;用户体验差。 RabbitMQ引言 二、RabbitMQ介绍 MQ全称为Message Queue&#xff0c;消息队列是应用程序和应用程序之间的通信方法。…

如何利用AI生成可视化图表(统计图、流程图、思维导图……)免代码一键绘制图表

由于目前的AI生成图表工具存在以下几个方面的问题&#xff1a; 大多AI图表平台是纯英文&#xff0c;对国内用户来说不够友好&#xff1b;部分平台在生成图表前仍需选择图表类型、配置项&#xff0c;操作繁琐&#xff1b;他们仍需一份规整的数据表格&#xff0c;需要人为对数据…

碧海威L7云路由无线运营版 confirm.php/jumper.php 命令注入漏洞复现(XVE-2024-15716)

0x01 产品简介 碧海威L7网络设备是 北京智慧云巅科技有限公司下的产品,基于国产化ARM硬件平台,采用软硬一体协同设计方案,释放出产品最大效能,具有高性能,高扩展,产品性能强劲,具备万兆吞吐能力,支持上万用户同时在线等高性能。其采用简单清晰的可视化WEB管理界面,支持…

python序列

列表 与字符串的索引一样&#xff0c;列表索引从 0 开始&#xff0c;第二个索引是 1&#xff0c;依此类推。 通过索引列表可以进行截取、组合等操作 创建一个列表 list [red, green, blue, yellow, white, black]正向取值 print(list[1])反向取值 print(list[-2])更新列…

吉时利 Keithley2601B-PULSE 脉冲数字源表

Keithley2601B-PULSE吉时利脉冲SMU数字源表 无需手动脉冲调整即可实现高脉冲保真度 通过 2601B-PULSE 控制回路系统&#xff0c;高达 3μH 的负载变化无需手动调整&#xff0c;从而确保在任何电流水平&#xff08;最高 10 安培&#xff09;下输出 10 μs 至 500 μs 脉冲时&a…

【火猫】欧洲杯:西班牙老将去卡塔尔淘金,皇马赚麻了

欧洲杯正在如火如荼的进行中&#xff0c;球员的经纪人也在幕后紧罗密布的操作&#xff0c;已经有多位球员将会在新赛季更换门庭。目前正在西班牙国家队征战欧洲杯的老将何塞卢迎来了好消息&#xff0c;根据知名记者罗马诺爆料&#xff0c;何塞卢将会在下赛季加盟卡塔尔球队加拉…

本教程将指导如何通过 Vue 组件和后端 API 交互

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

HarmonyOS开发实战:加密类组件使用方法-API

加密类组件 模块介绍RSA提RSA供生成密钥加解密验签等系列方法(基于HarmonyOS API)AES提供AES生成密钥加解密等系列方法(基于HarmonyOS API)DES提供3DES生成密钥加解密等系列方法(基于HarmonyOS API)SM2提供SM2生成密钥加解密等系列方法(基于HarmonyOS API)SM3提供SM3生成摘要,…

HDFS详细介绍以及HDFS集群环境部署【hadoop组件HDFS笔记】(图片均为学习时截取的)

HDFS详细介绍 HDFS是什么 HDFS是Hadoop三大组件(HDFS、MapReduce、YARN)之一 全称是&#xff1a;Hadoop Distributed File System&#xff08;Hadoop分布式文件系统&#xff09;&#xff1b;是Hadoop技术栈内提供的分布式数据存储解决方案 可以在多台服务器上构建存储集群&…

42.HOOK引擎核心代码

上一个内容&#xff1a;41.HOOK引擎设计原理 以 40.设计HOOK引擎的好处 它的代码为基础进行修改 主要做的是读写寄存器 效果图 添加一个类 htdHook.h文件中的实现 #pragma once class htdHook { public:htdHook(); };htdHook.cpp文件中的实现&#xff1a; #include "…

论文阅读:Simple and Efficient Heterogeneous Graph Neural Network

Yang, Xiaocheng, Mingyu Yan, Shirui Pan, Xiaochun Ye and Dongrui Fan. “Simple and Efficient Heterogeneous Graph Neural Network.” AAAI Conference on Artificial Intelligence (2022). 论文地址&#xff1a;[PDF] Simple and Efficient Heterogeneous Graph Neural…

centos7 xtrabackup mysql 基本测试(5)mysql 建立 测试 数据库及内容

centos7 xtrabackup mysql 基本测试&#xff08;5&#xff09;mysql 建立 测试 数据库及内容 登录 mysql -u etc -p 1234aA~1创建数据库 名字是company show databases ; create database company;在 company里面 创建表employee use company; DROP TABLE IF EXISTS employ…

Webpack: 构建 NPM Library

概述 虽然 Webpack 多数情况下被用于构建 Web 应用&#xff0c;但与 Rollup、Snowpack 等工具类似&#xff0c;Webpack 同样具有完备的构建 NPM 库的能力。与一般场景相比&#xff0c;构建 NPM 库时需要注意&#xff1a; 正确导出模块内容&#xff1b;不要将第三方包打包进产…

C : 线性规划例题求解

Submit Page TestData Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 93 Solved: 49 Description 求解下述线性规划模型的最优值min &#xfffd;1&#xfffd;1&#xfffd;2&#xfffd;2&#xfffd;3&#xfffd;3&#xfffd;.&#xfffd;. &…

Pbootcms留言“提交成功”的提示语怎么修改

我们在用到pbootcms建站时候&#xff0c;其中有个留言功能&#xff0c;提交成功后会提示&#xff1a;提交成功&#xff08;如下图所示&#xff09;&#xff0c;那么我们要修改这个提示语要怎么操作呢&#xff1f; 如果需要修改的话&#xff0c;直接找到文件/apps/home/control…

完美世界|单机版合集(共22个版本)

前言 我是研究单机的老罗&#xff0c;今天给大家带来的是完美世界的单机版合集&#xff0c;一共22个版本。本人亲自测试了一个版本&#xff0c;运行视频如下&#xff1a; 完美世界|单机版合集 先看所有的版本的文件&#xff0c;文件比较大&#xff0c;准备好空间&#xff0c;差…

运行CDN

背景 CDN代码&#xff0c;调试运行 日常 git clone代码配置虚拟环境 puthon3.8,pip install r requirements.txt改项目数据集路径&#xff0c;在hico.py文件里面 # PATHS {# train: (root / images / train2015, root / annotations / trainval_hico.json),# val: …