新手简单看懂Servlet里面的web.xml配置

news2024/9/23 21:21:35

背景:

ecplise+tomcat+servlet

我们在学习servlet时候,因为前面基础没学好,导致servlet看不懂,比如笔者当时就是servlet的web.xml看不懂,如果我们能先看懂web.xml,知道前端访问哪个接口,调用哪个servlet,至少就能从宏观上了解项目,对项目有一定促进作用本文的目标在于使新手尽量简单看懂前端请求和web.xml中的配置有啥关系

整体项目介绍链接如下:

Servlet技术实现服务端,Android平台作为客户端,实现一个个人店铺_zew1040994588的博客-CSDN博客

登录例子讲解:

项目整体目录:

后端登录接口demo:

这里我们不关注具体代码内容咋写的,只关注他和web.xml有什么关系!

这里是userLoign.java里面的内容:
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.User;
import dao.UserDao;
import net.sf.json.JSONObject;
import utils.JsonObjectWeb;
import utils.JsonResultUtil;


public class userLogin extends HttpServlet {

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//0、解决返回中文乱码问题
		resp.setCharacterEncoding("UTF-8");
		JSONObject web_dict = JsonObjectWeb.getJsonInfoDict(req);
		
    	String username = web_dict.getString("username");
        String password = web_dict.getString("password");
        User user = new User();//创建user对象
        user.setUsername(username);
        user.setPassword(password);
        /*
         * 这里需要查询数据库是否重名,若有重名则不允许插入,返回不同状态码
         * */
        int flag = 0;
        UserDao dao = new UserDao();
        User login_user = null;
        try {
        	login_user = dao.login(username,password);
			if(login_user != null) {
		        int user_id = login_user.id.intValue();
		        JSONObject data_dict = new JSONObject();
		        data_dict.put("user_id", user_id);
			    JSONObject json = JsonResultUtil.getJson(200,data_dict, "登录成功");
			    PrintWriter writer = resp.getWriter();	
			    //这里是返回json
			    writer.print(json);
			    flag = -1;
			}
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        if (flag == 0) {
            JSONObject json = JsonResultUtil.getJson(1002, "登录失败");
            PrintWriter writer = resp.getWriter();	
            //这里是返回json
            writer.print(json);
        }
        
    }
}

后端web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>shop_sys2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  
   <servlet>
    <servlet-name>user_login</servlet-name>
    <servlet-class>servlet.userLogin</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>user_login</servlet-name>
    <!-- 登录 -->
    <url-pattern>/user/login</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>user_register</servlet-name>
    <servlet-class>servlet.userRegister</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>user_register</servlet-name>
    <!-- 注册 -->
    <url-pattern>/user/register</url-pattern>
  </servlet-mapping>
  
    <servlet>
    <servlet-name>user_update_password</servlet-name>
    <servlet-class>servlet.userChange</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>user_update_password</servlet-name>
    <!-- 注册 -->
    <url-pattern>/user/update/password</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>product_view_all</servlet-name>
    <servlet-class>servlet.productView</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>product_view_all</servlet-name>
    <!-- 展示所有商品 -->
    <url-pattern>/product/view/all</url-pattern>
  </servlet-mapping>  
  
  
  <servlet>
    <servlet-name>cart_view</servlet-name>
    <servlet-class>servlet.cartView</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cart_view</servlet-name>
    <!-- 显示用户购物车 -->
    <url-pattern>/cart/view</url-pattern>
  </servlet-mapping> 
  
   <servlet>
    <servlet-name>product_add_cart</servlet-name>
    <servlet-class>servlet.cartAdd</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>product_add_cart</servlet-name>
    <!-- 添加商品到购物车 -->
    <url-pattern>/product/add/cart</url-pattern>
  </servlet-mapping> 
  
  <servlet>
    <servlet-name>product_delete_cart</servlet-name>
    <servlet-class>servlet.cartDelete</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>product_delete_cart</servlet-name>
    <!-- 将商品从购物车中删除 -->
    <url-pattern>/product/delete/cart</url-pattern>
  </servlet-mapping> 
	
  <servlet>
    <servlet-name>cart_settlement</servlet-name>
    <servlet-class>servlet.cartSettlement</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cart_settlement</servlet-name>
    <!-- 购物车页面对商品进行结算 -->
    <url-pattern>/cart/settlement</url-pattern>
  </servlet-mapping> 
  
    <servlet>
    <servlet-name>view_orders</servlet-name>
    <servlet-class>servlet.orderView</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>view_orders</servlet-name>
    <!-- 查看所有订单 -->
    <url-pattern>/view/orders</url-pattern>
  </servlet-mapping> 
  
   <servlet>
    <servlet-name>product_purchase</servlet-name>
    <servlet-class>servlet.productPurchase</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>product_purchase</servlet-name>
    <!-- 商品页面进行直接购买 -->
    <url-pattern>/product/purchase</url-pattern>
  </servlet-mapping> 
  
  
</web-app>

前端登录页面:

 前端界面调用后端的接口:

接口名为:127.0.0.1:8080/shop_sys2/user/login

 逻辑讲解:

1-先配置 <servlet></servlet>里面的内容,再配置<servlet-mapping></servlet-mapping>里面的内容。

2-<servlet></servlet>这个配置相当于是绑定userLogin.java,

而在userLogin.java中我们写的void doPost(省略形参)具体是后端预备用来处理前端以Post方式请求127.0.0.1:8080/shop_sys2/user/login时所编写的后台逻辑,比如查询数据库看看用户能否登录之类的【当然也可以处理Get请求,我们没写处理Get的】。而怎么把这个servlet让前端能够访问的到,这就是web.xml的作用所在了。当然有很多种处理方式,web.xml是最基础的一种。后期熟练可以用注解。

3-  <servlet-mapping>  </servlet-mapping>里面的内容配置

就是应对前端请求127.0.0.1:8080/shop_sys2/user/login的Post方式,

3.1-通过<servlet-mapping></servlet-mapping>中的<url-pattern>/user/login</url-pattern>让后台识别到前端发送了127.0.0.1:8080/shop_sys2/user/login这个请求

此后根据<servlet-name>user_login</servlet-name>获取到的user_login,去找到   <servlet></servlet>内容中的<servlet-name>user_login</servlet-name>,

让逻辑能够进入到对应的servlet去处理【这一步是由<servlet-class>servlet.userLogin</servlet-class>里面的内容servlet.userLogin来决定的!!!!】,再之后就是具体的userLogin.java的void doPost(省略形参)里面的查询数据库之类的了。

这里文字叙述若觉得不理解,可以看看下面的图,兴许你就理解了。

   <servlet>
    <servlet-name>user_login</servlet-name>
    <servlet-class>servlet.userLogin</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>user_login</servlet-name>
    <!-- 登录 -->
    <url-pattern>/user/login</url-pattern>
  </servlet-mapping>

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

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

相关文章

一个VBA的概率的模型(草稿)(未完成)

现在 可以让概率变化一般的抽奖&#xff0c;都是 概率稳定的&#xff0c;好处是稳定&#xff0c;没啥好处坏处是&#xff0c;不同的人次数差距很大&#xff0c;无法形成稳定的预期 概率0.1 变成概率0.1&#xff0c;如果失败就增加概率 这个增加概率可以是&#xff0c;已经失…

Flutter学习四:Flutter开发基础(五)资源管理

目录 0 引言 1 资源管理 1.1 指定 assets 1.2 Asset 变体&#xff08;variant&#xff09; 1.3 加载 assets 1.3.1 加载文本 1.3.2 加载图片 1.3.2.1 声明分辨率相关的图片 1.3.2.2 加载图片 1.3.3 依赖包中的资源图片 1.3.4 打包包中的 assets 1.3.5 特定平台 as…

B062-组件 路由 属性扩展 webpack Vue-cli

目录 一&#xff1a;组件1.何为组件2.组件的定义方式全局组件局部组件 3.组件的注意事项4.template的定义方式5.组件获取数据的方式 二&#xff1a;路由1.什么是路由&#xff1f;2.路由的使用步骤 三&#xff1a;Vue属性扩展1.计算属性 computed和监听属性 watch3.钩子函数 mou…

【Redis 三种模式----主从复制、哨兵以及集群】

目录 一、主从复制1.1、主从复制的概念1.2、主从复制的作用1.3、主从复制流程1.4、搭建Redis 主从复制1、环境准备2、安装Redis3、修改 Redis 配置文件&#xff08;Master节点操作&#xff09;4、修改 Redis 配置文件&#xff08;Slave节点操作&#xff09;5、验证主从效果 二、…

[牛客周赛复盘] 牛客周赛 Round 1 20230702

[牛客周赛复盘] 牛客周赛 Round 1 20230702 总结游游画U1. 题目描述2. 思路分析3. 代码实现 游游的数组染色1. 题目描述2. 思路分析3. 代码实现 游游的交换字符1. 题目描述2. 思路分析3. 代码实现 游游的9的倍数1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 牛客第一…

时序预测 | MATLAB实现BO-NARX和BO-LSTM贝叶斯优化神经网络股票价格预测比较

时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较 目录 时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较效果一览基本介绍研究过程程序…

《分布式中间件技术实战:Java版》学习笔记(二):RabbitMQ死信队列/延迟队列实现商品扣库存

一.关于RabbitMQ 1.RabbitMQ交换机类型 (1).FanoutExchange&#xff1a;广播交换机。消息发送到交换机后&#xff0c;会广播到所有队列&#xff0c;不需要经过路由。 (2).DirectExchange&#xff1a;直通交换机。生产者发送消息到交换机(Exchange)&#xff0c;再经过路由(Ro…

自然语言处理从入门到应用——预训练模型总览:预训练模型的拓展

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 预训练模型总览&#xff1a;从宏观视角了解预训练模型 预训练模型总览&#xff1a;词嵌入的两大范式 预训练模型总览&#xff1a;两大任务类型 预训练模型总览&#xff1a;预训练模型的拓展 …

Fully-Convolutional Siamese Networks for Object Tracking(SiamFC)

Fully-Convolutional Siamese Networks for Object Tracking&#xff08;SiamFC&#xff0c;ECCV2016&#xff09; 全卷积网络的优势在于&#xff0c;可以将一个更大的搜索图像作为输入提供给网络&#xff0c;它将在单个评估中计算所有平移后的子窗口的相似度&#xff0c;而不…

安全中级11:sql注入+联合、报错、时间盲注+sqlmap使用

目录 一、sql注入原理 二、联合SQL注入的方法 1.总体的思路 &#xff08;1&#xff09;先进行闭合&#xff0c;进行报错 &#xff08;2&#xff09;进行逃逸 &#xff08;3&#xff09;外带数据 &#xff08;4&#xff09;获取库名 表名 列名 数据 &#xff08;5&#…

【PADS封装】Dsub(DB9,DB15d等)公母头座子封装(带3D)

包含了我们平时常用的贴片Dsub(DB9,DB15等)公母头座子封装&#xff0c;总共28种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 1.D-Sub是被用来连接数据生成设备和数据输出设备&#xff0c;D-Sub和VGA&#xff0c;两者叫法不同。VGA是IBM在1987…

node-sass 安装失败解决办法

前言 很多小伙伴在安装 node-sass 的时候都失败了&#xff0c;主要的原因是 node 版本和项目依赖的 node-sass 版本不匹配。 解决方案 解决方案&#xff1a;把项目中的 node-sass 替换为 sass&#xff0c;其实 node-sass 已被官方弃用。 官方公告&#xff1a; LibSass and …

Echarts X轴label标签文本和刻度线对齐显示,而不是呈现在两个刻度线之间

如下图所示X轴标签文本Mon位于两个刻度线中间&#xff1a; 想要的效果是如下图&#xff0c;刻度线正下方是标签文本Mon&#xff1a; 只需要在xAxis中添加axisTick的alignWithLabel属性&#xff0c;属性值设为true即可&#xff1a; option {xAxis: {type: category,axisTick: …

Nginx【Nginx虚拟主机单网卡多IP配置、Nginx虚拟主机基于域名的配置 】(四)-全面详解(学习总结---从入门到深化)

Nginx虚拟主机单网卡多IP配置 通过不同的IP区分不同的虚拟主机&#xff0c;此类虚拟主机对应的企业应用非常少见&#xff0c;一般不同业务需要使用多IP的常见都会在负载均衡器上进行VIP绑定&#xff0c;而不是在Web上通过绑定IP区分不同的虚拟机。 需求 一台Linux服务器绑定两…

Hadoop基础——MapReduce

1. Hadoop序列化和反序列化及自定义bean对象实现序列化&#xff1f; 1) 序列化和反序列化的含义序列化是将内存中的对象转换为字节序列&#xff0c;以便持久化和网络传输。 反序列化就是将字节序列或者是持久化数据转换成内存中的对象。 Java的序列化是一个重量级序列化框架&a…

《TCP IP网络编程》第一章

2023.6.28 正式开始学习网络编程。 每一章每一节的笔记都会记录在博客中以便复习。 第1章 1.1理解网络编程和套接字 网络编程又叫套接字编程。所谓网络编程&#xff0c;就是编写程序使两台连网的计算机相互交换数据。 为什么叫套接字编程&#xff1f; 我们平常将插头插入插座上…

基于传统检测算法hog+svm实现目标检测

直接上效果图&#xff1a; 代码仓库和视频演示b站视频004期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; 数据集在data文件夹下 需要检测的目标对象数据集放在positive文件夹下 不需要的检测对象放在negative文件夹下…

如何提高个人领导力?

当今竞争激烈的商业环境中&#xff0c;领导力变得越来越重要。领导力不仅是一项人类的艺术和科学&#xff0c;还由对人和组织的理解、管理和激励能力组成。因此&#xff0c;不断提高自身的领导力水平是每个领导者必须面对的挑战。而对于想要提高自身领导力的读者来说&#xff0…

复习之linux中的远程登陆服务

一、实验环境配置 本次实验需要两台新的虚拟机&#xff0c;因此我们reset虚拟机aa 和 bb 修改虚拟机的主机名配置基础ip网络删除/root/.ssh/目录------恢复原始状态 1. 重置虚拟机aa,bb # westos-vmctl reset aa 2. 修改虚拟机的主机名 # hostnamectl set-hostname b…

结构体指针

结构体数组 #include<stdio.h> struct student {char name[20];int age;int scores[3];char addr[50]; }; int main() {struct student stu{"林冲",30,100,100,100,"汴京"};struct student* p;p&stu;//printf("%s\n",(*p).name);//pr…