JSP:MVC

Web应用

一个好的Web应用:

  功能完善

  易于实现和维护

  易于扩展等

的体系结构

一个Web应用通常分为两个部分

m 1. 由界面设计人员完成的 表示层

(主要做网页界面设计)

m 2. 由程序设计人员实现的 行为层

(主要完成本Web应用的各种功能)

m

Web开发的两种常用模式

Web开发的两种常用模式

Model1 纯JSP或JSP+javabean

适用于小型的Web应用

m 模型 1 可以分为两种方式
m 1. 完全使用JSP页面

优点:简单,所见即所得,容易实现

缺点:访问数据库的代码需要写在JSP页面中,如果数据库发生变化JSP页面需要重写

2.使用JSP+JavaBean

优点数据访问代码和JSP页面分离,数据访问代码重用性好

缺点系统复杂时,JSP页面中仍会包含大量脚本代码,代码开发和维护困难

Model2 MVC模式

   模型2其实就是一种MVC体系结构,也称为MVC模型2该模型是一种将应用分解成三个独立部分的通用模型。

m 这三个部分分别是:
m 模型 (Model) 描述系统的数据
m 视图 (view) 数据的显示,包括图形、文本和文件输出等;
m 控制器 (Controller) 获取系统的输入,控制系统的执行;
m
m MVC Model-View-Controller 的缩写
m Model 代表的是应用程序的商业逻辑 (通过 JavaBean EJB 等组件实现)
m View 提供可交互的客户界面 ,向客户显示模型数据(使用 JSP 来输出 HTML );
m Controller 响应客户的请求 ,根据客户的请求操纵模型,并把模型的响应结果由视图展现给客户 通常是 Servlet ;

MVC好处

m 各司其职,互不干涉
m MVC 模式中,三个层各司其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。
m 有利于开发中的分工
m MVC 模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的 JSP ,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。
m 有利于组件的重用
m 分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。
MVC 有助于把应用分离成合理的组件,以方便开发
  MVC(Servlet、JSP、JavaBean相结合)
m Servlet 扮演控制者的角色,接受客户请求 ,创建 JavaBean JavaBean 执行业务逻辑 ,向 Servlet 返回结果。 Servlet 将结果交给 JSP 页面 ,由 JSP 页面生成 HTML 向客户返回结果
m

MVC模式来实现用户注册

1.模型(JavaBean) -

   useBe.Register.class

package useBe;

public class Register

{   String logname="",password="",email="";

    String backNews;

    public void setLogname(String name)

    {  logname=name;

    }

   public String getLogname()

    { return logname;

    }

   public void setPassword(String pw)

    {  password=pw;

    }

 

 public String getPassword()

    { return password;

    }

   public void setEmail(String em)

    {  email=em;

    }

   public String getEmail()

    {  return email;

    }

   public String getBackNews()

    { return backNews;

    }

   public void setBackNews(String s)

    { backNews=s;

    }

}

2.控制器(servlet) -

   useSe.HandleRegister.class

package useSe;

import  useBe.Register;

import java.sql.*;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HandleRegister extends HttpServlet

{   public void init(ServletConfig config) throws ServletException

    { super.init(config);

      try {  Class.forName("com.mysql.jdbc.Driver");

          }

       catch(Exception e){}

    }

   public String handleString(String s)

   {   try{ byte bb[]=s.getBytes("iso-8859-1");

            s=new String(bb);

          }

       catch(Exception ee){}

       return s; 

   }

 void  doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

    {   Connection con;

        Statement sql;

Register reg=new Register();   //创建Javabean对象

        request.setAttribute("register",reg);//将dataBean存储到request对象中

        String logname=request.getParameter("logname").trim(),

        password=request.getParameter("password").trim(),

        email=request.getParameter("email").trim();

        String uri="jdbc:mysql://127.0.0.1:3306/test1";

        if(logname==null)

           logname="";

        if(password==null)

           password="";

        boolean isLD=true;    

       for(int i=0;i<logname.length();i++)

        {  char c=logname.charAt(i);

           if(!((c<='z'&&c>='a')||(c<='Z'&&c>='A')||(c<='9'&&c>='0')))

             isLD=false;

        }

        boolean boo=logname.length()>0&&password.length()>0&&isLD;

        String backNews="";

        try{ con=DriverManager.getConnection(uri,"root","123456");

             String insertCondition="INSERT INTO member VALUES ('"+logname+"','"+password+"','"+email+"')";

             sql=con.createStatement();

             if(boo)

             { int m=sql.executeUpdate(insertCondition);

               if(m!=0)

                 {  backNews="注册成功";

                    reg.setBackNews(backNews);

                    reg.setLogname(logname);

                    reg.setPassword(handleString(password));

                    reg.setEmail(handleString(email));

                  }

              }

             else

              {  backNews="信息填写不完整或名字中有非法字符";

                 reg.setBackNews(backNews); 

              }

             con.close();

           }

        catch(SQLException exp)

          {  backNews="该会员名已被使用,请您更换名字"+exp;

             reg.setBackNews(backNews);

          }

        RequestDispatcher dispatcher=request.getRequestDispatcher("show.jsp");//请求show.jsp显示信息

        dispatcher.forward(request, response);

    }

   public  void  doGet(HttpServletRequest request,HttpServletResponse response)

                        throws ServletException,IOException

    {   doPost(request,response);

    }

}

MVC模式来实现用户注册

3.视图(jsp)

register.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<head>

<table>

 <td><A href="register.jsp"><font size=5>用户注册</font></A></td>

</table>

</head>

<HTML><BODY bgcolor=cyan><Font size=5><CENTER>

<FORM action="helpRegister" name=form>

<table>

    输入您的信息,用户名称必须由字母和数字组成,带*号项必须填写。

   <tr><td>用户名称:</td><td><Input type=text name="logname" >*</td></tr>

   <tr><td>设置密码:</td><td><Input type=password name="password">*</td></tr>

   <tr><td>电子邮件:</td><td><Input type=text name="email"></td></tr>

   <tr><td><Input type=submit name="g" value="提交"></td></tr>

</table>

</Form></CENTER>

</Body></HTML>

show.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="useBe.Register"%>

<jsp:useBean id="register" type="useBe.Register" scope="request"/>

<head>

<table>

 <td><A href="register.jsp"><font size=5>用户注册</font></A></td>

</table>

</head>

<HTML><BODY bgcolor=yellow>

<CENTER>

  <Font size=5 color=blue >

    <BR><jsp:getProperty name="register"  property="backNews"/>

  </Font>

<table>

 <tr><td>注册的名称:</td>

     <td><jsp:getProperty name="register" property="logname"/></td>

 </tr>

 <tr><td>注册的电子邮件:</td>

     <td><jsp:getProperty name="register" property="email"/></td>

 </tr>

</table>

</CENTER></BODY></HTML>

    MVC模式的核心思想是有效地组合“视图”、“模型”和“控制器”。

      本章将介绍MVC模式,掌握该模式对于设计合理的Web应用以及学习使用某些流行的Web框架,如HibernateSpringStruts等,都有着十分重要的意义。

    MVC是一种通过三个不同部分构造一个软件或组件的理想办法:

模型(Model——用于存储数据的对象。

视图(View——为模型提供数据显示的对象。

控制器(Controller——负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出处理,并将有关结果存储到模型中,同时负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。

    JSP技术中,“视图”、“模型”和“控制器”的具体实现如下:

模型(Model):

   一个或多个JavaBean对象,用于存储数据,JavaBean主要提供简单的setXXX()方法和getXXX()方法,在这些方法中不涉及对数据的具体处理细节。

视图(View):

    一个或多个JSP页面,为模型提供数据显示,JSP页面主要使用 HTML标记和JavaBean标记来显示数据。

控制器(Controller

    一个或多个Servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到JavaBean中,然后Servlet使用重定向方式请求视图中的某个JSP页面更新显示。

 JSP+Javabean模式中,由JSP页面通过使用useBean标记:

<jsp:useBean id="名字" class="创建bean的类" scope="生命周期"/>创建Javabean

    JSP中的MVC模式中,也可以由控制器servet创建Javabean,并将有关数据存储到所创建的Javabean中,然后servlet请求某个JSP页面使用JavabeangetProperty动作标记:

<jsp:getProperty name= "名字" property="bean的属性"/>

显示Javabean的中的数据。

    在JSP中的MVC模式中,非常重要的手段是由servlet负责用构造方法创建Javabean,因此允许创建Javabean的类可以有带参数的构造方法。

     在JSP中的MVC模式中,servet创建的Javabean也涉及到生命周期(有效期限),生命周期分为requestsessionapplication。以下假设创建Javabean的类的名字是BeanClass,该类的包名为user.yourbean

 request周期的Javabean

   1Javabean的创建

   servlet负责创建bean。那么创建生命周期为requestbean的步骤如下:

1)用BeanClass类的某个构造方法创建bean对象,例如:

         BeanClass bean=new BeanClass();

2)将所创建的bean对象存放到HttpSerletRequest对象request中,并指定查找该bean的关键字,该步骤决定了bean的生命周期为request。例如:

        request.setAttribute("keyWord",bean);

执行上述操作,就会把bean存放到Tomcat引擎管理的内置对象pageContext中,该bean被指定的id"keyWord",生命周期是  

       PageContext.REQUEST_SCOPErequest。  

2   视图更新

    servlet请求一个JSP页面,比如show.jsp的代码如下:

RequestDispatcher dispatcher= request.getRequestDispatcher("show.jsp");

dispatcher.forward(request,response);

    servlet所请求的JSP页面可以使用如下标记获得servlet所创建的bean的引用(type属性使得该JSP页面不负责创建bean

<jsp:useBean id="keyWord" type="user.yourbean.BeanClass" scope="request"/>

该标记中的idservlet所创建的bean索引关键字。然后JSP页面使用<jsp:getProperty name="keyWord" property="bean的变量"/>标记显示bean中的数据。如果上述代码执行成功,用户就看到了show.jsp页面的执行效果。

    特别注意: 如果servlet所请求的JSP页面,使用如下标记获得servlet所创建的bean的引用(注意没有用type属性而是用class属性)

  <jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="request"/>

该标记中的idservlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面事先已经有了id"keyWord"scope"request"bean,那么这个bean也会被servlet所创建的bean替换。

     原因是servlet所请求的JSP页面会被刷新,就会根据当前页面使用的<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="request"/> 标记到Tomcat引擎管理的内置对象PageContext中寻找id"keyWord",生命周期是request,而该bean已经被servlet更新了。

   session周期的Javabean

    1Javabean的创建

   servet创建生命周期为sessionbean的步骤如下:

1)用BeanClass类的某个构造方法创建bean对象,例如:

    BeanClass bean=new BeanClass();

2)将所创建的bean对象存放到HttpSerletSession对象:session中,并指定查找该bean的关键字,该步骤决定了bean的生命周期为session。例如:

     HttpSession session=request.getSession(true);

     session.setAttribute("keyWord",bean);

   内置对象执行上述操作,就会把bean存放到Tomcat引擎管理的内置对象pageContext中,该bean被指定的id"keyWord",生命周期是PageContext.SESSION_SCOPEsession)。  

   2   视图更新

    servelt创建bean, bean的生命周期为session只要用户的session没有消失,该bean就一直存在,一个用户在访问Web服务目录的各个JSP中都可以使用<jsp:useBean id="keyWord" type="usern.yourbean.BeanClass" scope="session"/> 标记获得servlet所创建的bean的引用,然后使用<jsp:getProperty name="keyWord" property="bean的变量"/>标记显示该bean中的数据,该标记中的idservlet所创建的bean索引关键字。

    对于生命周期为sessionbean,如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象向该JSP页面发出请求,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)。

    show.jsp页面使用如下标记获得servlet所创建的bean的引用(注意没有用type属性而是用class属性)<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="session"/>该标记中的idservlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面或其他页面事先已经有了id"keyWord"scope" session "bean,那么这个bean也会被servlet所创建的bean替换。

     原因是,servlet所请求的JSP页面或其他页面被刷新时,就会根据当前页面使用的<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope=" session "/>标记到Tomcat引擎管理的内置对象PageContext中寻找id"keyWord",生命周期是session,而该bean已经被servlet更新了。

 application周期的Javabean

   1Javabean的创建

    servet创建生命周期为applicationbean的步骤如下:

1BeanClass类的某个构造方法创建bean对象,例如:

         BeanClass bean=new BeanClass();

2servlet使用getServletContext()方法返回服务器的ServletContext内置对象的引用,将所创建的bean对象存放到服务器这个ServletContext内置对象中,并指定查找该bean的关键字,该步骤决定了bean的生命周期为application,例如:

      getServletContext().setAttribute("keyWord",bean);

上述操作,就会把bean存放到Tomcat引擎管理的内置对象pageContext中,该bean被指定的id"keyWord",有效期限是(生命周期)PageContext.APPLICATION_SCOPEapplication 

2   视图更新

    servlet创建创建生命周期为applicationbean后,只要Web应用程序不结束,该bean就一直存在。一个用户在访问Web服务目录的各个JSP中都可以使用<jsp:useBean id="keyWord" type="user.yourbean.BeanClass" scope="application"/>  标记获得servlet所创建的bean的引用,然后使用

<jsp:getProperty name="keyWord" property="bean的变量"/>标记显示该Javabean中的数据,该标记中的idservlet所创建的bean索引关键字。

    对于生命周期为applicationbean,如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象向该JSP页面发出请求,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)。

    注意:所有用户在同一个Web服务目录中的application生命周期的bean是相同的,即占有相同的内存空间。另外,如果servlet所请求的JSP页面,比如show.jsp页面,使用如下标记获得servlet所创建的bean的引用(注意没有用type属性而是用class属性)<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="application"/>该标记中的idservlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面或其他事先已经有了id"keyWord"scope"application"bean,那么这个bean也会被servlet所创建的bean替换。

   原因是,servlet所请求的JSP页面或其他页面被刷新时,就会根据当前页面使用的:<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="application"/>标记到Tomcat引擎管理的内置对象PageContext中寻找id"keyWord",生命周期是application,而该bean已经被servlet更新了。

 JavabeanServlet与配置文件

   Javabean类的包名均为mybean.dataServlet类的包名均为myservlet.control

1.保存Javabean类和Servlet类的源文件

    D:\ mybean\data  和  D:\myservlet\control

2.编译Javabean

    D:\javac mybean\data\Javabean的源文件

3.编译Servlet

    D:\ javac myservlet\control\servlet的源文件

4.将类的字节码文件保存到服务器

     ch9\WEB-INF\classes\mybean\data

     ch9\WEB-INF\classes\myservlet\control

5web.xml文件

   编写web.xml文件,并保存到Web服务目录的WEB-INF子目录中,即ch9\WEB-INF中 。  

MVC模式与注册登录    大部分Web应用都会涉及到注册与登录模块。本节使用MVC模式讲述怎样设计注册、登录模块。为ch9\WEB-INF中的web.xml文件添加如下子标记

    JavabeanServlet管理

    本节的Javabean类的包名均为mybean.dataServlet类的包名均为myservlet.control

1.保存Javabean类和Servlet类的源文件

   D:\ mybean\data D:\myservlet\control

2.编译Javabean

     D:> javac mybean\data\Javabean的源文件

3.编译Servlet

      D:> javac myservlet\control\servlet的源文件

4.将类的字节码文件保存到服务器

     ch9\WEB-INF\classes\mybean\data  

     ch9\WEB-INF\classes\myservlet\control  

配置文件管理

    本节的Servlet类的包名均为myservlet.control,需要配置Web服务目录的web.xml文件,即将下面的web.xml文件保存到Tomcat安装目录的Web服务目录ch9中。根据本书使用的Tomcat安装目录及Web服务目录,需要将web.xml文件保存到

D:\apache-tomcat-8.0.3\webapps\ch9\WEB-INF

目录中。    

web.xml

<servlet>

    <servlet-name>register</servlet-name>

    <servlet-class>myservlet.control.HandleRegister</servlet-class>

</servlet>

<servlet-mapping>

   <servlet-name>register</servlet-name>

   <url-pattern>/helpRegister</url-pattern>

</servlet-mapping>

<servlet>

    <servlet-name>login</servlet-name>

    <servlet-class>myservlet.control.HandleLogin</servlet-class>

</servlet>

<servlet-mapping>

   <servlet-name>login</servlet-name>

   <url-pattern>/helpLogin</url-pattern>

</servlet-mapping>

  数据库设计与连接

   1  创建一个数据库 、表  

使用MySQL建立一个数据库student,该库共有一个user表 。

    user表的用途:存储用户的注册信息。即会员的注册信息存入user表中,user表的主键是logname,各个字段值的说明如下:

logname 存储注册的用户名(属性是字符型,主键)。

password 存储密码(属性是字符型)。

email 存储email(属性是字符型)。     

2  数据库连接

    避免操作数据库出现中文乱码,需要使用

      Connection getConnection(java.lang.String) 方法建立连接,连接中的代码是(用户是root,其密码是空)

 String url = "jdbc:mysql://127.0.0.1/student?"+

             "user=root&password=&characterEncoding=gb2312";

Connection con = DriverManager.getConnection(uri);

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

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

相关文章

2015年7月8日 Go生态洞察:Go、开源与社区

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

基于springboot实现大学生就业服务平台系统项目【项目源码】计算机毕业设计

基于springboot实现大学生就业服务平台系统演示 Java技术 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著…

企业必看的大数据安全极速传输解决方案

在这个大数据时代&#xff0c;企业在享受大数据带来的便利同时&#xff0c;也面临着巨大的挑战&#xff0c;其中最主要的问题就是数据安全方面和传输方面&#xff0c;为了更好地满足企业大数据传输的需求&#xff0c;小编将深入分析企业对于大数据传输面临的挑战和风险以及大数…

【elementui】el-popover在列表里循环使用,取消的doClose无效解决办法

目录 一、需求效果二、代码详情html方法接口 一、需求效果 在使用elementui的Popover 弹出框时&#xff0c;需求是在table列表里使用&#xff0c;循环出来&#xff0c;无法取消。 二、代码详情 html <el-table-column v-if"checkPermission([admin,user:resetPass…

【C++】标准模板库STL作业(其二)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Py之wikipedia-api:wikipedia-api的简介、安装、使用方法之详细攻略

Py之wikipedia-api&#xff1a;wikipedia-api的简介、安装、使用方法之详细攻略 目录 wikipedia-api的简介 wikipedia-api的安装 wikipedia-api的使用方法 1、 创建 Wikipedia并进行查询 wikipedia-api的简介 Wikipedia-API是一个易于使用的Python封装&#xff0c;用于访…

计算机是如何执行指令的

计算机组成 现在所说的计算机基本上都是冯诺依曼体系的计算机。其核心原理&#xff1a; 冯诺依曼计算的核心思想是将程序指令和数据以二进制形式存储存储在同一存储器中&#xff0c;并使用相同的数据格式和处理方式来处理它们。这种存储程序的设计理念使得计算机能够以可编程…

如何从 C# 制作报表到 FastReport Cloud

众所周知&#xff0c;我们的世界在不断发展&#xff0c;新技术几乎每天都会出现。如今&#xff0c;不再需要在办公室内建立整个基础设施、雇用人员来监控设备、处理该设备出现的问题和其他困难。 如今&#xff0c;越来越多的服务提供业务云解决方案&#xff0c;例如FastReport…

我的虚拟人物介绍

背景 大家好&#xff0c;我是小欣&#xff0c;是这个博客的虚拟助手。在这里&#xff0c;我将为大家提供各种有趣、实用、甚至是意想不到的信息。作为一个年轻的语言模型&#xff0c;我的目标是为你们呈现出最有趣和有深度的内容。 我喜欢与大家分享知识、解答问题&#xff0…

AI“胡说八道”?怎么解?

原创 | 文 BFT机器人 01 引言 近年来&#xff0c;人工智能产业迅猛发展&#xff0c;大型语言模型GPT-4发展势头强劲&#xff0c;OpenAI推出ChatGPT、微软推出Bing、马斯克推出“最好的聊天机器人Grok”……科技巨头纷纷入局AI领域&#xff0c;引入人工智能作为办公工具的行业…

合封芯片未来趋势如何?合封优势能否体现?

芯片已经成为现代电子设备的核心组件。为了提高系统的性能、稳定性和功耗效率&#xff0c;一种先进的芯片封装技术——合封芯片应运而生。 合封芯片作为一种先进的芯片封装技术&#xff0c;合封芯片是一种将多个芯片&#xff08;多样选择&#xff09;或不同的功能的电子元器件…

AIGC专题报告:生成式人工智能用例汇编

今天分享的是AIGC系列深度研究报告&#xff1a;《AIGC专题报告&#xff1a;生成式人工智能用例汇编》。 &#xff08;报告出品方&#xff1a;德勤&#xff09; 报告共计&#xff1a;16页 生成式人工智能&#xff08;AI&#xff09;的兴起 生成式AI给人类文明创造了无限的可…

文心一言 VS 讯飞星火 VS chatgpt (142)-- 算法导论12.1 2题

二、用go语言&#xff0c;二叉搜索树性质与最小堆性质(见 6.1 节)之间有什么不同?能使用最小堆性质在 O(n)时间内按序输出一棵有 n 个结点树的关键字吗?可以的话&#xff0c;请说明如何做&#xff0c;否则解释理由。 文心一言&#xff1a; 在二叉搜索树&#xff08;Binary …

ruoyi 若依框架采用第三方登录

在项目中&#xff0c;前后端分离的若依项目&#xff0c;需要通过统一认证&#xff0c;或者是第三方协带认证信息跳转到本系统的指定页面。需要前后端都做相应的改造&#xff0c;由于第一次实现时已过了很久&#xff0c;再次重写时&#xff0c;发现还是搞了很长时间&#xff0c;…

PasteNow for mac剪贴板工具

PasteNow 是一款简单易用的剪贴板管理工具&#xff0c;可帮助用户快速存储和管理剪贴板上的文本和图片内容。用户可以使用 PasteNow 软件快速将文本内容保存到不同的笔记或页面中&#xff0c;也可以方便地将剪贴板上的图片保存到本地或分享给其他应用程序。 此外&#xff0c;P…

vue 通过ref调用router-view子组件的方法

由于用的vue2.7版本&#xff0c;但用了vue3 setup的语法&#xff1b; 注意&#xff1a;是vue2的template结构&#xff0c;vue3的setup语法&#xff1b;非这种情况需要举一反三。 处理方案&#xff1a; 1、对router-view加上ref template修改 直接对router-view加上ref&#x…

金蝶云星空和四化智造MES(WEB)单据接口对接

金蝶云星空和四化智造MES&#xff08;WEB&#xff09;单据接口对接 对接系统&#xff1a;四化智造MES&#xff08;WEB&#xff09; MES系统是集成生产管理、品质管理、设备管理、BI数据中心、库存管理、工时管理、数据采集、看板管理等为一体的综合性生产管理系统。通过强调制造…

wagtail-安装配置

系列文章目录 文章目录 系列文章目录安装虚拟环境安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 安装虚拟环境 https://blog.csdn.net/gsl371/article/details/117917857 安装wagtail (wagenv) C:\djproject\wagprj>pip list Package V…

synchronized的轻量级锁居然不会自旋?

《Java并发编程的艺术》中说到「如果失败&#xff0c;表示其他线程竞争锁&#xff0c;当前线程便尝试使用自旋来获取锁」&#xff0c;并且下文所配的流程图中明确表示自旋失败后才会升级为重量级锁&#xff0c;但《深入理解Java虚拟机》又说「如果出现两条以上的线程争用同一个…

超声波雪深传感器冬季里的科技魔法

在冬季的某个清晨&#xff0c;当你打开大门&#xff0c;被厚厚的积雪覆盖的大地映入眼帘&#xff0c;你是否曾想过&#xff0c;这片雪地的深度是多少&#xff1f;它又如何影响着我们的生活和环境&#xff1f;今天&#xff0c;我们将为你揭开这个谜团&#xff0c;介绍一款神秘的…