JavaWeb系列七: 动态WEB开发核心(Servlet) 下

韩老师学生

  • ServletConfig
  • ServletContext
    • 网站计数器
  • HttpServletRequest
    • 细节1
    • 细节2
    • 细节3
  • Dispathcer
    • 请求转发应用实例
    • 请求转发细节和注意事项
    • 习题
  • HttpServletResponse
    • 请求重定向
    • 请求重定向注意事项
    • 动态获取到application context
    • 练习题

在这里插入图片描述

ServletConfig

ServletConfig基本介绍
1.ServletConfig 类是为Servlet程序配置信息的类
2.Servlet程序和ServletConfig对象都是由Tomcat负责创建的
3.Servlet程序默认是第1次访问的时候创建.ServletConfigServlet程序创建时, 就创建一个对应的ServletConfig对象

ServletConfig类能干什么
1.获取Servlet程序的servlet-name的值
2.获取初始化参数init-param
3.获取ServletContext对象

ServletConfig应用实例
需求: 编写DBServlet.java, 实现如下功能
1.在web.xml中编写连接mysql的用户名和密码
2.在DBServlet执行doGet() / doPost()方法时, 均可以获取到web.xml配置的用户名和密码
3.示意图(思路分析)
在这里插入图片描述

1.web.xml配置DBServlet

<servlet><servlet-name>DBServlet</servlet-name><servlet-class>com.zzw.servlet.DBServlet</servlet-class><!--配置信息, 而不是硬编码到程序--><init-param><param-name>username</param-name><param-value>zzw</param-value></init-param><init-param><param-name>pwd</param-name><param-value>123456</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>DBServlet</servlet-name><url-pattern>/dbServlet</url-pattern>
</servlet-mapping>

2.在com.zzw.servlet下新建DBServlet

public class DBServlet extends HttpServlet {/*** 老师梳理ServletConfig config 使用流程* 1.当DBServlet对象初始化时, tomcat会同时创建一个 ServletConfig对象* 2.这时如果DBServlet init() 方法中你调用super.init(config)* 3.调用 父类 GenericServlet*     public void init(ServletConfig config) throws ServletException {*         this.config = config;*         this.init();*     }* 4.这时就会把 Tomcat创建的 ServletConfig对象赋给 GenericServlet的属性 config* 5.如果注销super.init(config), 那么在doGet,doPost和其它方法中将无法通过 getServletConfig() 方法获取ServletConfig* 6.因此如果你要重写init()方法, 还想在其它方法通过 getServletConfig() 方法获取ServletConfig*   , 则一定要记住 在init()方法中 调用 super.init(config)* @param config* @throws ServletException*/@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("init() config=" + config);super.init(config);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//在DBServlet执行doGet() / doPost()方法时, 均可以获取到web.xml配置的用户名和密码//OOP程序员->现有的方法或对象来实现//DBServlet的父类有GenericServlet有getServletConfig()/*** 解读* 1. getServletConfig() 方法是 GenericServlet* 2. 返回的 servletConfig对象是 GenericServlet private transient ServletConfig config;* 3. 当一个属性被transient修饰, 表示该属性不会被串行化(有些重要信息, 不希望保存到文件)*/ServletConfig servletConfig = this.getServletConfig();System.out.println("doPost() servletConfig=" + servletConfig);String username = servletConfig.getInitParameter("username");String pwd = servletConfig.getInitParameter("pwd");System.out.println("初始化参数username=" + username);System.out.println("初始化参数pwd=" + pwd);}
}

ServletContext

为什么需要ServletContext
1.先看一个需求: 如果我们希望统计某个web应用所有的Servlet被访问的次数, 怎么办?
2.方案1-DB

在这里插入图片描述

2.方案2-ServletContext

在这里插入图片描述

ServletContext基本介绍

  1. ServletContext是一个接口, 他表示Servlet上下文对象
  2. 一个web工程, 只有一个ServletContext对象实例
  3. ServletContext对象在web工程启动的时候创建, 在web工程停止的时候销毁
  4. ServletContext对象可以通过this.getServletConfig().getServletContext()方法获得ServletContext对象的引用, 也可以通过this.getServletContext()来获得其对象的引用
  5. 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象, 因此Servlet对象之间可以通过ServletContext对象来实现通信. ServletContext对象通常也称之为域对象.

ServletContext可以做什么
1.获取web.xml 中配置的上下文参数context-param[这个信息和整个web应用相关, 而不是属于某个Servlet]
2.获取当前的工程路径, 格式: /工程路径 ⇒ 比如 /servlet
3.获取工程部署后在服务器硬盘上的绝对路径 (比如: D:\idea_project\zzw_javaweb\servlet\out\artifacts\servlet_war_exploded)
4.像Map一样存取数据, 多个Servlet共享数据
在这里插入图片描述

应用实例1-获取工程相关信息
●需求如下
1.获取web.xml中配置的上下文参数 context-param
2.获取当前的工程路径, 格式: /工程路径
3.获取工程部署后在服务器硬盘上的绝对路径

●代码实现
1.修改web.xml, 增加相关配置

<!--配置整个网站的信息-->
<context-param><param-name>website</param-name><param-value>http://www.baidu.com</param-value>
</context-param>
<context-param><param-name>company</param-name><param-value>百度</param-value>
</context-param>

2.web.xml配置ServletContext_

<!--配置ServletContext_-->
<servlet><servlet-name>ServletContext_</servlet-name><servlet-class>com.zzw.servlet.servletcontext.ServletContext_</servlet-class>
</servlet>
<servlet-mapping><servlet-name>ServletContext_</servlet-name><url-pattern>/servletContext_</url-pattern>
</servlet-mapping>

3.com.zzw.servlet.servletcontext下新建ServletContext_

public class ServletContext_ extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取web.xml的context-parameter//1.获取ServletContext对象ServletContext servletContext =this.getServletConfig().getServletContext();//2.获取websiteString website = servletContext.getInitParameter("website");String company = servletContext.getInitParameter("company");//3.获取项目的工程路径String contextPath = servletContext.getContextPath();//4.获取项目发布后, 真正的工作路径//  / 表示我们的项目(发布后)的 根路径//  D:\idea_project\zzw_javaweb\servlet3\out\artifacts\servlet3_war_explodedString realPath = servletContext.getRealPath("/");System.out.println("项目发布后的绝对路径 realPath=" + realPath);System.out.println("contextPath=" + contextPath);System.out.println("website=" + website);System.out.println("company=" + company);}
}

网站计数器

需求分析/图解
1.需求: 完成一个简单的网站访问次数计数器
2.使用Chrome访问Servlet01, 每访问一次, 就增加1访问次数, 在后台输出, 并将结果返回给浏览器显示.
3.使用火狐访问Servlet02, 每访问一次, 就增加1访问次数, 在后台输出, 并将结果返回给浏览器显示.
在这里插入图片描述

●代码实现
1.在web.xml配置OrderServlet, PayServlet

<servlet><servlet-name>OrderServlet</servlet-name><servlet-class>com.zzw.servlet.servletcontext.OrderServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>OrderServlet</servlet-name><url-pattern>/orderServlet</url-pattern>
</servlet-mapping>
<servlet><servlet-name>PayServlet</servlet-name><servlet-class>com.zzw.servlet.servletcontext.PayServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>PayServlet</servlet-name><url-pattern>/payServlet</url-pattern>
</servlet-mapping>

2.com.zzw.servlet.servletcontext创建OrderServlet

public class OrderServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取到ServletContext对象ServletContext servletContext =this.getServletConfig().getServletContext();//System.out.println("OrderServlet servletContext=" + servletContext + " 运行类型=" + servletContext.getClass());从servletContext获取 visit_count 属性//Object visit_count = servletContext.getAttribute("visit_count");判断visit_count是否为null//if (visit_count == null) {//说明是第1次访问//    servletContext.setAttribute("visit_count", 1);//    visit_count = 1;//} else {//是第二次或以后//    //取出visit_count属性的值+1//    visit_count = Integer.parseInt(visit_count + "") + 1;//    //放回到servletContext//    servletContext.setAttribute("visit_count", visit_count);//}Integer visit_count = WebUtils.visitCount(servletContext);//输出显示response.setContentType("text/html;charset=utf-8");response.getWriter().write("<h1>新网站被访问的次数是</h1>" + visit_count + "次</h1>");}
}

3.com.zzw.servlet.servletcontext创建PayServlet

public class PayServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取到ServletContext对象ServletContext servletContext =this.getServletConfig().getServletContext();//System.out.println("PayServlet servletContext=" + servletContext + " 运行类型=" + servletContext.getClass());从servletContext获取 visit_count 属性//Object visit_count = servletContext.getAttribute("visit_count");判断visit_count是否为null//if (visit_count == null) {//说明是第1次访问//    servletContext.setAttribute("visit_count", 1);//    visit_count = 1;//} else {//是第二次或以后//    //取出visit_count属性的值+1//    visit_count = Integer.parseInt(visit_count + "") + 1;//    //放回到servletContext//    servletContext.setAttribute("visit_count", visit_count);//}Integer visit_count = WebUtils.visitCount(servletContext);//输出显示response.setContentType("text/html;charset=utf-8");response.getWriter().write("<h1>新网站被访问的次数是</h1>" + visit_count + "次</h1>");}
}

4.在com.zzw.servlet.servletcontext新建WebUtils

public class WebUtils {//这个方法就是对访问的次数累积, 同时返回次数public static Integer visitCount(ServletContext servletContext) {//从servletContext获取 visit_count 属性Object visit_count = servletContext.getAttribute("visit_count");//判断visit_count是否为nullif (visit_count == null) {//说明是第1次访问servletContext.setAttribute("visit_count", 1);visit_count = 1;} else {//是第二次或以后//取出visit_count属性的值+1visit_count = Integer.parseInt(visit_count + "") + 1;//放回到servletContextservletContext.setAttribute("visit_count", visit_count);}return Integer.parseInt(visit_count + "");}
}

5.测试
在这里插入图片描述

HttpServletRequest

  1. HttpServletRequest对象代表客户端的请求
  2. 当客户端/浏览器通过HTTP协议访问服务器时, HTTP请求头中所有的信息都封装在这个对象中
  3. 通过这个对象的方法, 可以获取客户端信息
  • 常用方法
  1. getRequestURI() 获取请求的资源路径 http://localhost:8080/servlet/login.html
  2. getRequestURL() 获取请求的统一资源定位符(绝对路径) http://localhost:8080/servlet/login.html
  3. getHeader() 获取请求头
  4. getParameter() 获取请求的参数
  5. getParameterValues() 获取请求的参数(多个值时使用) 比如checkbox, 或返回的数组
  6. getRemoteHost() 获取客户端的主机
  7. getRemoteAddr() 获取客户端的ip
  8. getMethod() 获取请求的方式(GET或POST)
  9. setAttribute(key, value) 设置域数据
  10. getRequestDispatcher() 获取请求转发对象(核心对象)
public class HttpServletRequestMethods extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*********************************      获取http请求头相关信息      *********************************/System.out.println("请求头信息");System.out.println("资源路径URI(请求中的)=" + request.getRequestURI());System.out.println("统一资源定位符(绝对路径)URL=" + request.getRequestURL());System.out.println("客户端ip地址=" + request.getRemoteAddr());//获取http请求头的信息: 可以使用request.getHeader("请求头字段")// 可以指定 Accept, Accept-Encoding, Accept-Language, Connection, Cookie, Host, RefererString accept = request.getHeader("Accept");System.out.println("http请求头中的Accept信息=" + accept);/*********************************        获取表单提交的数据        *********************************///1.获取单个表单数据// 解决接收参数的中文乱码问题, 不能写在request.getParameter()后面request.setCharacterEncoding("utf-8");//浏览器按照urlEncode编码方式提交数据, 后端要用utf-8来接收String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username=" + username);System.out.println("password=" + password);//前端不填传给后端则是一个空字符串"", 不是null//2.获取一组表单数据 复选框, 下拉框String[] favorites = request.getParameterValues("favorite");if (favorites != null) {//复选框前端不选则后端返回一个nullfor (String favorite : favorites) {System.out.println(favorite);}}}
}

细节1

  1. text, date, password, email类型的输入框和下拉框如果不填值会将空字符串传给后端:username=&password=&date=, 后端用request.getParameter()接收这些值便是空字符串
  2. 单选框, 复选框如果不选(不包括下拉框), 则不向后台传值, 即username=&password=&date=这里根本就没有单选框和复选框的参数, 后台通过request.getParameter()或request.getParameterValues()获取实际上是获取了一个不存在的参数. 如果单选框, request.getParameter()返回一个字符串, 这个字符串为null, 如果是复选框, request.getParameterValues()返回字符串数组, 那么这个字符串数组为null, 如果对这个字符串数组遍历会报错, 因为null.length会报错

细节2

  1. 浏览器按照urlEncode编码方式提交数据, 后端要用utf-8来接收: request.setCharacterEncoding(“utf-8”); 且这句话要写在request.getParameter()前面
  2. 后台将接收的数据返回给页面时, 要设置响应头的Content-Type参数为text/html; charset=utf-8, 因为数据中包含中文, 并且是文本类型
    //本质实在http响应头加上Content-Type: text/html;charset=utf-8response.setContentType("text/html; charset=utf-8");PrintWriter writer = response.getWriter();writer.print("<h1>提交的用户名=" + username + "</h1>");writer.flush();writer.close();

细节3

再次理解Http协议Content-Type的含义, text/html 表示返回的数据类型, 浏览器会根据这个类型来解析数据

    //本质实在http响应头加上Content-Type: text/html;charset=utf-8// text/plain 表示返回的数据,请浏览器使用文本方式解析// application/x-tar 表示返回的是一个文件,浏览器就会以下载文件的方式处理response.setContentType("application/x-tar; charset=utf-8");PrintWriter writer = response.getWriter();writer.print("<h1>提交的用户名=" + username + "</h1>");writer.flush();writer.close();

Dispathcer

在这里插入图片描述

  1. 实现请求转发: 请求转发指一个web资源收到客户端请求后, 通知服务器(比如Tomcat)去调用另外一个web资源进行处理
  2. HttpServletRequest对象(也叫Request对象)提供了一个getRequestDispather方法, 该方法返回一个RequestDispacher对象, 调用这个对象的forward方法可以实现请求转发
  3. request对象同时也是一个域对象, 开发人员通过request对象在实现转发时, 把数据通过request对象带给其它web资源
    setAttribute方法
    getAttribute方法
    removeAttribute方法
    getAttributeNames方法
    在这里插入图片描述

请求转发应用实例

前提: 新建两个Servlet, 并做好配置

public class CheckServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("CheckServlet doPost 输出");//根据用户名来确定该用户是什么身份request.setCharacterEncoding("utf-8");String username = request.getParameter("username");//注意: 如果是同一个request对象(请求转发), 那么可以在不同的Servlet中使用getParameter取出同一个参数if ("猫".equals(username)) {//分配管理员权限request.setAttribute("role", "管理员");} else {request.setAttribute("role", "普通用户");}//获取分发器//解读一下:1./managerServlet写的是 要转发的servlet的url//       2./ 会被解析成 /servletRequestDispatcher requestDispatcher = request.getRequestDispatcher("/managerServlet");//       3.forward(request, response) 会把当前Servlet的request,response对象传给下一个Servlet使用requestDispatcher.forward(request, response);}
}
public class ManagerServlet extends HttpServlet {private int count;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String role = (String) request.getAttribute("role");//输出response.setContentType("text/html; charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>用户名 " + username + "</h1>");writer.print("<h1>角色=" + role + "</h1>");writer.flush();writer.close();}
}

请求转发细节和注意事项

  1. 浏览器地址栏不会发生变化(地址会停留在第1个servlet的url)
  2. 在同一次HTTP请求中, 进行多次转发, 仍然是一次HTTP请求
  3. 在同一次HTTP请求中, 进行多次转发, 多个Servlet可以共享request域/对象的数据(因为始终是同一个request对象)
  4. 可以转发到WEB-INF目录下
  5. 不能访问当前WEB工程外的资源
  6. 转发和重定向的后续代码会被执行, 根据情况可添加return 👉参考
    在这里插入图片描述

习题

编写一个Servlet获取请求参数中的操作系统和位数

public class GetInfoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//谷歌浏览器:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36String userAgent = request.getHeader("User-Agent");String regStr = "\\(([\\w\\ \\.;]+)\\)";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(userAgent);matcher.find();//group(0) = (Windows NT 10.0; Win64; x64)//group(1) = Windows NT 10.0; Win64; x64String[] split = matcher.group(1).split(";");System.out.println("操作系统=" + split[0]);System.out.println("操作系统位数=" + split[1].trim());}
}

HttpServletResponse

  • 基本介绍
  1. 每次HTTP请求, Tomcat会创建一个HttpServletResponse对象传递给Servlet使用
  • 乱码问题
  1. 处理乱码问题方案1
    在这里插入图片描述
  2. 处理乱码问题方案2
    在这里插入图片描述

请求重定向

  1. 请求重定向是指: 一个web资源收到客户端请求后, 通知客户端去访问另外一个web资源, 这称之为重定向
  2. 请求重定向分析图
    在这里插入图片描述
    测试代码
public class DownServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("DownServlet 自己的业务");//1.sendRedirect 本质会返回一个 302状态码 和 Location: /servlet/downServletNew//2.因此 302状态码 和 /servlet/downServletNew是浏览器解析的//3.浏览器会将 /servlet/downServletNew 解析成http://localhost:8080/servlet/downServletNewresponse.sendRedirect("/servlet/downServletNew");}
}
public class DownServletNew extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("DownServletNew doPost");response.setContentType("application/x-tar; charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>下载完成</h1>");writer.flush();writer.close();}
}
<body>
<h2>下载文件</h2>
<a href="http://localhost:8888/servlet/downServlet">下载&lt;&lt;三体&gt;&gt;小说</a>
</body>

测试结果
在这里插入图片描述
在这里插入图片描述

请求重定向注意事项

  1. 最佳应用场景: 网站迁移, 比如原域名是 www.zzw.com 迁移到 www.world.cn, 但是百度抓取的还是原来的网址
  2. 浏览器地址会发生变化, 本质是两次Http请求
  3. 不能共享Request域中的数据, 本质是两次Http请求, 会生成两个HttpServletRequest对象
  4. 不能重定向到WEB-INF下的资源
  5. 可以重定向到Web工程以外的资源, 比如到http://www.baidu.com
  6. 重定向有两种方式, 推荐使用第1种
//第一种重定向使用
response.sendRedirect("/servlet/downServletNew");
//第二种重定向使用
response.setStatus(302);//设置http响应的状态码
//设置http响应的Location: /servlet/downServletNew
response.setHeader("Location", "/servlet/downServletNew");

动态获取到application context

在这里插入图片描述

//动态获取 application context
String contextPath = getServletContext().getContextPath();
System.out.println(contextPath);// /servlet
response.sendRedirect(contextPath + "/downServletNew");

在这里插入图片描述

练习题

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>支付页面</title>
</head>
<body>
<h1>支付页面</h1>
<!--这里action的第1个/ 会被浏览器解析成浏览器地址栏的主机名-->
<form action="/servlet/myPayServlet">用户编号:<input type="text" name="userId"/>支付金额:<input type="text" name="money"/><input type="submit" value="点击支付">
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>支付成功</title>
</head>
<body>
<h1>恭喜你支付成功</h1>
</body>
</html>
public class MyPayServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String userId = request.getParameter("userId");String money = request.getParameter("money");String contextPath = getServletContext().getContextPath();if (WebUtils.parseString(money) > 100) {response.sendRedirect(contextPath + "/pay_ok.html");} else {response.sendRedirect(contextPath + "/pay.html");}}
}
public class WebUtils {public static int parseString(String str) {int num = 0;try {//shortcuts: ctrl+alt+tnum = Integer.parseInt(str);} catch (NumberFormatException e) {System.out.println("输入的str格式不正确");}return num;}
}
<servlet><servlet-name>MyPayServlet</servlet-name><servlet-class>com.zzw.servlet.response.MyPayServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyPayServlet</servlet-name><url-pattern>/myPayServlet</url-pattern></servlet-mapping>

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

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

相关文章

1.文件上传漏洞渗透及防御(OWASP实战训练)

1.文件上传漏洞渗透及防御&#xff08;OWASP实战训练&#xff09; OWASPupload上传漏洞实验一&#xff1a;低安全模式下&#xff0c;上传任意类型的文件&#xff0c;文件大小不受限制实验二&#xff0c;安全级别调整将其变为中等安全级别实验三&#xff1a;将其设为高安全级别 …

【教程】如何一步一步训练一个SOM神经网络-自组织竞争神经网络(Self-organizing Feature Map)

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是SOM神经网络1.1.SOM神经网络有什么用1.2.SOM神经网络是如何聚类的 二、如何训练一个SOM神经网络2.1. 训练一个SOM神经网络的代码示例2.2. 如何查看SOM神经网络的聚类中心 SOM神经网络全称为自组织竞争…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据&#xff0c;不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

rancher快照备份至S3

巧用rancher的S3快照备份功能&#xff0c;快速实现集群复制、集群转移、完全崩溃后的极限修复 1.进入集群管理&#xff0c;在对应的集群菜单后&#xff0c;点击编辑配置 2.选择ETCD&#xff0c;启用&#xff0c;Backup Snapshots to S3选项 并填入你的minio 3 配置成功后 手…

C# 信号量的使用

学习来源&#xff1a;《.net core 底层入门》 第六章第9节&#xff1a;信号量 案例&#xff1a;主线程负责添加数据&#xff0c;子线程负责获取数据 使用SemaphoreSlim&#xff08;轻信号量&#xff09;实现&#xff1a; using System; using System.Collections.Generic; us…

python中的<class ‘complex‘>

一般编程里面不怎么会讲&#xff0c;但是还是挺强大的一个类。 在 Python 中&#xff0c;<class complex> 表示复数类型。复数是一种包含实部和虚部的数学数&#xff0c;可以用 a bj 的形式表示&#xff0c;其中 a 表示实部&#xff0c;b 表示虚部&#xff0c;j 是虚数…

13 物理层介质及设备

物理层介质及设备 一、线缆的连接 &#xff08;一&#xff09;线序 ​ 线序&#xff1a; RJ-45连接头12345678568A绿白绿橙白蓝蓝白橙棕白棕568B橙白橙绿白蓝蓝白绿棕白棕 ​ 1、2发送&#xff0c;3、6接收 &#xff08;二&#xff09;线缆的应用 1.线缆的连接 ​ 标准…

Spring自定义标签体系和应用

我们知道&#xff0c;在使用Dubbo框架时&#xff0c;需要指定配置文件中的application、protocol、registry、provider、service等服务器端和客户端的配置项&#xff0c;典型的配置方法如下所示。通过这些配置项&#xff0c;我们可以基于Spring容器来启动Dubbo服务。 <!-- …

【2024.6.23】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

探索PHP中的函数

在PHP编程中&#xff0c;函数是一个非常重要的概念。函数可以帮助我们将代码组织成可重复使用的块&#xff0c;从而提高代码的可读性和可维护性。本文将介绍PHP中的函数&#xff0c;包括函数的定义、参数传递、返回值、内置函数和自定义函数等内容&#xff0c;帮助读者更好地理…

WPF 深入理解八、Binding 绑定

Binding 创建一个Demo 1 1.创建三个输入框&#xff0c;按钮 2.为按钮创建点击方法 3.点击按钮 三个输入框&#xff0c;分别更新了自己的内容。 上面的展示&#xff0c;是一个传统的模式&#xff0c;事件驱动程序&#xff0c;通过事件来变更UI控件元素的内容。 示例二 创建…

OS_虚拟机

2024.06.21&#xff1a;操作系统虚拟机学习笔记 第4节 虚拟机 4.1 虚拟机基本概念4.2 一型虚拟机管理程序4.3 二型虚拟机管理程序4.4 用户态与内核态 本节的主要内容就是来分辨两种不同的虚拟机管理程序 4.1 虚拟机基本概念 利用虚拟化技术&#xff0c;把一台物理机器虚拟成多…

2024年在WordPress中创建销售活动的入门级优惠券方法

2024年在WordPress中创建销售活动的入门级优惠券方法 今天我想和大家分享一些关于如何在WordPress网站上创建销售活动的经验。无论你是电商新手还是已经有一定经验的店主&#xff0c;优惠券都是吸引顾客、增加销量的有力工具。在这篇文章中&#xff0c;我将介绍三款适合初学者…

链轮简单认识一下

今天咱们聊的话题是——链轮&#xff0c;这个应用非常广泛的机械零件。 什么是链轮&#xff1f; 链轮是一种带有齿或尖刺的机械轮&#xff0c;用于与链条或皮带啮合&#xff0c;以促使“轮子”的旋转和运动。这种啮合可确保同步运动&#xff0c;使链轮和皮带能够高效地协同运行…

Linux-磁盘管理与文件系统

目录 一、磁盘结构 1、磁盘的物理结构 2、磁盘的数据结构 3、磁盘存储容量 4、接口类型 二、磁盘分区 1、磁盘的两种分区方式 1.1、MBR分区 1.2、GPT分区 三、查看硬盘的分区情况 1、Fdisk—查询磁盘设备 2、lsblk—以树形查看磁盘分区 3、blkid—查看磁盘的UUID …

Elasticsearch的快照

ES的快照是什么&#xff1f; snapshot是一个ES集群或者某个指定索引的备份&#xff0c;快照一般用在 不停机的状态下对ES集群进行备份当硬件故障时恢复集群数据用于跨集群的数据迁移对冷数据或冻结数据做快照以降低存储成本&#xff0c;依赖于可搜索的快照。-收费功能 一个快…

北邮《计算机网络》传输层笔记

内容一览 缩写复习单词复习传输层前言传输协议的要点拥塞控制UDPTCP VS UDPTCP 缩写复习 AIMD XCP ECN WFQ max-min-fair ARQ PAWS TSAP NSAP TCP UDP RTT SCTP SACK NAK RST MSS 单词复习 inverse multiplexing(SCTP) convergence crashed machine protocol scenarios asym…

基于SSM+Vue的宠物领养平台系统(带1w+文档)

基于SSMVue的宠物领养平台系统(带1w文档) 本课题研究和开发同城宠物帮管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高同城宠物帮信息处理速度&#xff0c;规范同城宠物帮信息处理流程&#xff0c;让管理人员的产出效益更高。 项目简介 基…

Spring(核心概念:IoC/DI思想)

目录 一、引言 &#xff08;1&#xff09;如今的代码书写现状 1、业务层 2、数据层 3、假如当项目上线发布之后&#xff0c;想把数据层的实现换一下 二、核心概念 &#xff08;1&#xff09;IoC&#xff08; Inversion of Control ) 控制反转 &#xff08;2&#xff09;…

HarmonyOS角落里的知识:“开发应用沉浸式效果”

概述 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条。开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 图1 界面元素示意图 开发应用沉浸式效果主要要考虑如下…