网络通信——与WEB服务器交换数据(三十)

news2025/1/19 14:16:30

1. 与WEB服务器交换数据

1.1 知识点

(1)可以通过地址重写的方式进行Web Server的访问;

(2)可以采用POST方式进行请求的提交;

(3)可以读取网络上的图片信息;

1.2 具体内容

首先我们简单介绍JavaWeb相关知识,JavaWeb开发的项目称为B/S架构,B代表就是浏览器,S代表是服务器,相对我们最早的C/S程序而言,有课长足的进步。目前主流的B/S开发程序设计语言有以下几种:

       ·Sun :jsp/Servlet JavaWeb\JavaEE,前台使用jsp(Java+javascript+html),后端使用Servlet(使用Java编写)

       ·微软:asp.net 前端asp(html+vbscript),后端使用C#

       ·php:早就过时了,但是使用php开发成本低,现在很多沿海地区一些山寨品牌推广还会使用php

       ·Adobe:Flex (html+actionscript) 后端大部分也是使用Java开发

怎么去开发JSP/ervlet,首先我们要搭建开发平台。

·数据库基本操作:

select * from dh10_student t for update;--表示查询并且可以编辑数据
insert into dh10_student (stu_id,stu_name,stu_age,stu_sex) values (1,'小明',20,1);--插入数据
select t.stu_id,t.stu_name,t.stu_age ,decode(nvl(t.stu_sex,0),0,'女',1,'男') from dh10_student t;--查询数据,并且给sex字段的值为别名
update dh10_student t set t.stu_sex=0 where t.stu_id=1; -- 修改
delete dh10_student t where  t.stu_id = 3;--删除

·使用JDBC连接数据库:JDBC是Java连接数据库的标准,就是说要使用Java连接数据库的话,必须要使用到JDBC。

       ·JDBC的操作步骤:

              ·加载驱动程序

              ·连接数据库,通过Connection接口和DriverManager类完成数据库连接

              ·操作数据库,对于数据库的更新使用Statement或者PrepedStatement,对于查询,使用ResultSet,那么这三个都是接口。

              ·关闭操作,数据库的资源是非常有限的,如果操作完成之后不关闭,就可能会造成数据库服务器的宕机。

对于数据库操作,如果是更新(增删改)需要进行事务的处理。

新增操作:

package com.wanczy.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCDemo01 {
	public static final String DBURL="jdbc:oracle:thin:@604-43:1521:wanczy";
	public static final String ORACLEDRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String DBNAME = "jjm";
	public static final String PASSWORD = "jjm";
	public static void main(String[] args) {//是Java运行的入口方法
		Connection conn = null;
		PreparedStatement pstat = null;
		try {
			Class.forName(ORACLEDRIVER);//加载驱动
			conn = DriverManager.getConnection(DBURL, DBNAME, PASSWORD);//取得数据库连接
			conn.setAutoCommit(false);//取消自动提交
			String sql = "insert into dh10_student (stu_id,stu_name,stu_age,stu_sex) values (?,?,?,?)";
			pstat = conn.prepareStatement(sql);//取得预处理的对象
			pstat.setInt(1, 3);
			pstat.setString(2, "李四");
			pstat.setInt(3, 21);
			pstat.setInt(4, 1);
			pstat.execute();//执行
			conn.commit();//如果没有异常进行提交
		} catch (Exception e) {
			try {
				conn.rollback();//如果出现异常则回滚
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
			try {
				pstat.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
}

对于删除和修改,只需要修改sql和pstat的设置 的值就OK了。

对于查询需要使用ResultSet接口接收查询的结果集。

package com.wanczy.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCDemo02 {
	public static final String DBURL="jdbc:oracle:thin:@604-43:1521:wanczy";
	public static final String ORACLEDRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String DBNAME = "mlz";
	public static final String PASSWORD = "mlz";
	public static void main(String[] args) {//是Java运行的入口方法
		Connection conn = null;
		PreparedStatement pstat = null;
		ResultSet res = null;
		try {
			Class.forName(ORACLEDRIVER);//加载驱动
			conn = DriverManager.getConnection(DBURL, DBNAME, PASSWORD);//取得数据库连接
			String sql = "select t.stu_id,t.stu_name,t.stu_age ,decode(nvl(t.stu_sex,0),0,'女',1,'男') from dh10_student t";
			pstat = conn.prepareStatement(sql);//取得预处理的对象
			res = pstat.executeQuery();//执行查询
			while(res.next()){
				System.out.println("ID:" + res.getInt(1)+"\t" + "姓名:" + res.getString(2)+"\t" +"年龄:" + res.getInt(3)+"\t" +"性别:" + res.getString(4)+"\t" );
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				res.close();
				pstat.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
}

对于JDBC的操作基本上能够了解。

对于我们昨天的WEB程序,怎么去进行数据库操作呢?

使用DAO设计模式:

DAO:数据库访问对象,Data  Access Object,用对象的形式来操作数据库。之前我们第一阶段的时候使用DAO模式,但是我们使用并不全面,对于数据库访问程序来说,应该使用面向对象的特征将程序进行包装,形成一个可重用的组件。

DAO设计模式的流程:

DAO 的组成:

       ·POJO:每个POJO的对象就是数据库中的一笔数据(表名+POJO)

       ·DAO:操作的接口,每个DAO接口按照功能的需求规定了一组对数据库的操作方法。(表名+DAO),DAO中的方法命名应该按照您跟以下的命名规则:

                     |·更新数据库操作doXXX(),新增doIns(),doUpd(),doDel

                    |·查询数据库操作:findXXX,查询全部findAll(),findByUsername()根据用户名查询,findById()根据ID查询

       ·实现类:是完成数据库操作的一个核心类,并且不专门去管理数据库连接的取得和关闭,因为实现类完成的是和具体业务相关的操作。

       ·代理类:代理完成数据流连接的取得和关闭,并且调用真实主题类(实现类)。

       ·工厂类:有接口就必须要有工厂,进行的是解耦合的操作。

参考代码:JavaWebDemo01/

·com.wanczy.login

·jsp/login

注意:之前的javaweb的开发中,在jsp中连接了数据库,但是现在要说的一点,在以后的开发中,jsp中是绝对不允许导入sql包的。DAO完成之后,实际上就是按照一个组件方法运行。

范例:登录程序

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
	<LinearLayout 
	    android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal"
	    >
	    <TextView
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="用户名" />
	    <EditText 
	        android:id="@+id/username"
	        android:layout_width="100px"
	        android:layout_height="wrap_content"
	        />
	</LinearLayout>
    <LinearLayout 
	    android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal"
	    >
	    <TextView
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="密    码" />
	    <EditText 
	        android:id="@+id/password"
	        android:layout_width="100px"
	        android:layout_height="wrap_content"
	        android:password="true"
	        />
	</LinearLayout>
	<Button 
	        android:id="@+id/login"
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:text="登录"
	        />
</LinearLayout>

关键就是在Activity通过Http向Web服务器发送请求。

package com.example.loginproject;

import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity {
	private EditText username = null;
	private EditText password = null;
	private Button login = null;
	private String inUsername = null;
	private String inPassword = null;
	private Handler myHandler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			switch(msg.what){
			case 1:
				Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_LONG).show();//接收到子线程的消息之后进行提示
				break;
			}
		}
		
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.username = (EditText) super.findViewById(R.id.username);
		this.password = (EditText) super.findViewById(R.id.password);
		this.login = (Button) super.findViewById(R.id.login);
		this.login.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
//				MainActivity.this.inUsername = MainActivity.this.username.getText().toString();
//				MainActivity.this.inPassword = MainActivity.this.password.getText().toString();
//				if(null == MainActivity.this.inUsername  ||"".equals(MainActivity.this.inUsername)){
//					Toast.makeText(MainActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();
//					return;
//				}
//				if(null == MainActivity.this.inPassword  ||"".equals(MainActivity.this.inPassword)){
//					Toast.makeText(MainActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();
//					return;
//				}
				new Thread(new Runnable(){
					public void run(){ 
						try{
							URL url = new URL("http","www.wanczymis.com",80,"/jsp/BaomingJsp.jsp?stu_num=1001&stu_name=abc&stu_tel=13515967537&stu_qq=544130858&stu_dorm=501&stu_sex=1");
							HttpURLConnection conn = (HttpURLConnection)url.openConnection();//取得连接
							byte b[] = new byte[1024];
							int len = conn.getInputStream().read(b);//接收数据
							String info = "报名失败";
							if(len>0){
								String s = new String(b,0,len).trim();
								boolean bool = Boolean.parseBoolean(s);
								if(bool){
									info = "报名成功";
								}
								
							}else{
								info ="连接失败";
							}
							Message mess = new Message();
							mess.what = 1;
							mess.obj = info;
							MainActivity.this.myHandler.sendMessage(mess);//发送消息
						}catch(Exception e){
							e.printStackTrace();
						}
						
					}
				}).start();
				
				
			}
		});
	}
}

以后在进行网络请求的时候必须使用子线程。

当然也需要配置权限。

<uses-permission android:name="android.permission.INTERNET"/>

以上就是使用Get进行提交,其实这种方式就是地址重写的方式,会受到地址长度的限制,所以在以后的开发中,一般使用post提交。

修改以上的程序,使用post方式进行提交。

package com.example.loginproject;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.content.Entity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity {
	private EditText username = null;
	private EditText password = null;
	private Button login = null;
	private String inUsername = null;
	private String inPassword = null;
	private Handler myHandler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			switch(msg.what){
			case 1:
				Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_LONG).show();//接收到子线程的消息之后进行提示
				break;
			}
		}
		
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.username = (EditText) super.findViewById(R.id.username);
		this.password = (EditText) super.findViewById(R.id.password);
		this.login = (Button) super.findViewById(R.id.login);
		this.login.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				MainActivity.this.inUsername = MainActivity.this.username.getText().toString().trim();
				MainActivity.this.inPassword = MainActivity.this.password.getText().toString().trim();
				if(null == MainActivity.this.inUsername  ||"".equals(MainActivity.this.inUsername)){
					Toast.makeText(MainActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();
					return;
				}
				if(null == MainActivity.this.inPassword  ||"".equals(MainActivity.this.inPassword)){
					Toast.makeText(MainActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();
					return;
				}
				new Thread(new Runnable(){
					public void run(){ 
						try{
							String url = "http://172.26.64.60:8080/AndroidTestWeb/LoginServlet";
							HttpPost request = new HttpPost(url);
							List<NameValuePair> params = new ArrayList<NameValuePair>();//用来保存参数
							params.add(new BasicNameValuePair("username", MainActivity.this.inUsername));
							params.add(new BasicNameValuePair("password", MainActivity.this.inPassword));
							request.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));//设置编码
							HttpResponse response = new DefaultHttpClient().execute(request);//接收回应
							boolean bool = false;
							String info = "登录失败";
							if(response.getStatusLine().getStatusCode()!=404 && response.getStatusLine().getStatusCode()!=500){
								String s = EntityUtils.toString(response.getEntity()).trim();
								bool = Boolean.parseBoolean(s);
								if(bool){
									info = "登录成功";
								}
							}else{
								info ="连接失败";
							}
							Message mess = new Message();
							mess.what = 1;
							mess.obj = info;
							MainActivity.this.myHandler.sendMessage(mess);//发送消息
						}catch(Exception e){
							e.printStackTrace();
						}
						
					}
				}).start();
				
				
			}
		});
	}
}

范例:获取网络上图片。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
     >
    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

Activity程序。

package com.example.getimageproject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView img = null;
	public static final String PATH = "http://www.wanczy.com/upload_images/20131101152009_912.jpg";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.img = (ImageView) super.findViewById(R.id.img);
		byte b[] = new byte[1024];
		try {
			b = this.getURLData();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Bitmap bm = BitmapFactory.decodeByteArray(b, 0,  b.length);
		this.img.setImageBitmap(bm);
	}
	public byte[] getURLData() throws Exception{
		ByteArrayOutputStream bos = null;//内存输出流
		try{
			URL url = new URL(PATH);
			bos = new ByteArrayOutputStream();
			byte b[] = new byte[1024];
			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			InputStream in = conn.getInputStream();//取得网络上字节输入流
			int temp = 0;//这个是一个过渡的变量,将字节输入流一个一个读取,赋值为temp,然后写入到内存输出刘中
			while((temp = in.read(b))!= -1){//将内容读取到字节数组中并且赋值给temp,且如果读取内容不为-1的话表示还可以继续往下读
				bos.write(b,0,temp);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				bos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return bos.toByteArray();
	}
}

如果使用子线程怎么完成?

package com.example.getimageproject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView img = null;
	public static final String PATH = "http://www.wanczy.com/upload_images/20131101152009_912.jpg";
	ByteArrayOutputStream bos = null;// 内存输出流
	private Handler myHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				byte b[] = new byte[1024];
				b = (byte[]) msg.obj;
				Bitmap bm = BitmapFactory.decodeByteArray(b, 0, b.length);
				MainActivity.this.img.setImageBitmap(bm);
				break;
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.img = (ImageView) super.findViewById(R.id.img);
		MainActivity.this.bos = new ByteArrayOutputStream();
		new Thread(new Runnable(){
			public void run(){
				try{
				byte b[] = new byte[1024];
				URL url = new URL(PATH);
				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
				InputStream in = conn.getInputStream();// 取得网络上字节输入流
				int temp = 0;// 这个是一个过渡的变量,将字节输入流一个一个读取,赋值为temp,然后写入到内存输出刘中
				while ((temp = in.read(b)) != -1) {// 将内容读取到字节数组中并且赋值给temp,且如果读取内容不为-1的话表示还可以继续往下读
					MainActivity.this.bos.write(b, 0, temp);
				}
				Message msg = new Message();
				msg.what =1;
				msg.obj = MainActivity.this.bos.toByteArray();
				MainActivity.this.myHandler.sendMessage(msg);
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}).start();
	}
}

对于以后开发网络请求,都需要使用到子线程进行提交请求。

1.3 小结

(1)如果需要网络则必须具有网络访问的权限;

(2)连接WEB Server的时候可以使用地址重写的方式,也可以使用POST提交的方式;

(3)使用Bitmap可以将读取下来的图片数据设置到ImageView中进行显示。

(4)对于以后网络请求开发,必须要使用到子线程进行。

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

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

相关文章

javaEE - 1(9000字详解多线程第一篇)

一&#xff1a;认识线程 1.1 线程的概念 线程是操作系统中执行的最小单位&#xff0c;它是进程中的一个实体。一个进程可以包含多个线程&#xff0c;并且这些线程共享进程的资源&#xff0c;如内存、文件句柄等&#xff0c;但每个线程有自己的独立执行流程和栈空间。 线程在…

SOAR安全事件编排自动化响应-安全运营实战

SOAR是最近几年安全市场上最火热的词汇之一。各个安全产商都先后推出了相应的产品&#xff0c;但大部分都用得不是很理想。SOAR不同与传统的安全设备&#xff0c;买来后实施部署就完事&#xff0c;SOAR是一个安全运营系统&#xff0c;是实现安全运营过程中人、工具、流程的有效…

【GlobalMapper精品教程】063:线转面,面转线、线折点转点、面折点转点、点生成线、点生成面案例教程

本文讲解globalmapper中进行矢量线转面,面转线、线折点转点、面折点转点、点生成线、点创建面的方法。 文章目录 一、 面转线二、线转面三、线折点转点四、面折点转点五、点生成线六、点生成面一、 面转线 加载《GlobalMapper中文实战精品教程》(订阅专栏,获取所有文章阅读…

C语言的offsetof宏模拟和用宏实现交换奇偶位

目录 1. offsetof宏模拟 2. 宏实现交换奇偶位 1. offsetof宏模拟 作用&#xff1a;该宏的作用是计算一个结构体中成员的偏移量 模拟实现&#xff1a; #define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName) StructType是结构体类型名…

python:talib.BBANDS 画股价-布林线图

python 安装使用 TA_lib 安装主要在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个网站找到 TA_Lib-0.4.24-cp310-cp310-win_amd64.whl pip install /pypi/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl 编写 talib_boll.py 如下 # -*- coding: utf-8 -*- import os impor…

jni:as 进行 JNI / NDK 开发:初步配置及使用

AndroidStudio 进行 JNI / NDK 开发&#xff1a;初步配置及使用-CSDN博客版权声明&#xff1a; 本文为博主原创文章&#xff0c;转载请标明出处。AndroidStudio 进行 JNI / NDK 开发&#xff1a;初步配置及使用-CSDN博客 一、相关名词解释 JNI&#xff1a;java native interf…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组队列

《数据结构、算法与应用C语言描述》使用C语言实现数组队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一端称…

Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)

HSV通道的含义 HSV通道是指图像处理中的一种颜色模型&#xff0c;它由色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&#xff08;Value&#xff09;三个通道组成。色调表示颜色的种类&#xff0c;饱和度表示颜色的纯度或鲜艳程度&#xf…

JAVA基础(JAVA SE)学习笔记(三)流程控制语句

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 JAVA基础&#xff08;JAVA SE&#xff09;学习笔记&#xff08;一&#xff09;JAVA学习路线、行业了解、…

Sql Server Report Service 使用简单说明

ReportServices做为报表服务器&#xff0c;结合sql直接访问数据库提供基本的报表格式设置显示&#xff0c;可以快速开发报表&#xff0c;主要包含两部分内容&#xff1a; 1.ReportServices服务器配置搭建&#xff0c;承载报表的运行平台 2.设计报表 ReportServices配置 1&am…

【C++初阶(二)】缺省参数函数重载

目录 前言 1. 缺省参数 1.1 什么是缺省参数 1.2 缺省参数的分类 1.2.1 全缺省参数 1.2.2 半缺省参数 2. 函数重载 2.1 什么是函数重载 2.2 缺省参数与函数重载 2.3 函数重载的使用 3. C支持函数重载的原因 总结 前言 在学习C语言时我们就会发现&#xff0c;C语言中存在的许多…

使用 Python 交互式方法预测股票价格变动概率

一、简介 当深入金融世界时,了解股价走势是一个显着的优势。在这里,我们提出了一种交互式方法,可以根据历史数据深入了解股价达到某些目标的可能性。 该工具利用 Python 强大的库,信息丰富且视觉上引人入胜。所提供的工具不会预测未来价格,而是评估价格波动的历史频率,让…

牛客网 -- WY28 跳石板

题目链接&#xff1a; 跳石板_牛客题霸_牛客网 (nowcoder.com) 解题步骤&#xff1a; 参考代码&#xff1a; void get_approximate(vector<int>& v,int n) {//求约数&#xff0c;从2到sqrt(n)即可&#xff0c;原因看图解//这里一定要等于sqrt(n)&#xff0c;例如16…

数据挖掘(6)聚类分析

一、什么是聚类分析 1.1概述 无指导的&#xff0c;数据集中类别未知类的特征&#xff1a; 类不是事先给定的&#xff0c;而是根据数据的相似性、距离划分的聚类的数目和结构都没有事先假定。挖掘有价值的客户: 找到客户的黄金客户ATM的安装位置 1.2区别 二、距离和相似系数 …

轻量级超分网络:Edge-oriented Convolution Block for Real-timeMM21_ECBSR 和 eSR

文章目录 ECBSR&#xff08;Edge-oriented Convolution Block for Real-timeMM21_ECBSR&#xff09;1. 作者目的是开发一个高效的适合移动端的超分网络。2. 作者决定使用plain net &#xff0c;但是效果不好&#xff0c;因此利用重参数化方法&#xff0c;丰富特征表示。3. re-p…

【数字人】6、ER-NeRF | 借助空间分解来实现基于 NeRF 的更高效的数字人生成(ICCV2023)

文章目录 一、背景二、方法2.1 问题设定2.2 Tri-Plane Hash Representation2.3 Region Attention Module2.4 训练细节 三、效果3.1 实验设定3.2 定量对比3.3 定性对比3.4 User study3.5 消融实验 四、代码4.1 视频数据预处理4.2 训练4.3 推理 论文&#xff1a;Efficient Region…

springboot+jaspersoft studio6制作报表

文章目录 前言一、开发工具下载安装二、开始制作1.新建1.文本2.图片3. 表格4.时间 三.遇到的问题1.中文不显示2.detail模块与column Footer之间有空白。怎么调节也消不掉 四.完整代码总结 前言 公司最近要做报销系统。需求就是将报销申请、报销审批。并将报销信息打印出来。 …

Nginx配置微服务避免actuator暴露

微服务一般在扫漏洞的情况下&#xff0c;需要屏蔽actuator健康检查 # 避免actuator暴露 if ($request_uri ~ "/actuator") { return 403; }

SD/SDIO(1):SD总线协议介绍

SD标准提供了很大的灵活性&#xff0c;除了作为存储卡外&#xff0c;还提供了SD卡槽的标准来扩展设备的功能。本篇文章就先来介绍一下SD总线的规范。对于SD/MMC协议的发展历史和概念介绍&#xff0c;可以参考我的这篇文章&#xff1a;SD、SDIO和MMC接口基础和规范介绍 文章目录…

【MySQL】数据库——库操作

文章目录 1. 创建数据库[IF NOT EXISTS] 的使用 2. 删除库3. 数据库的编码问题查看系统默认支持的字符集查看系统默认支持的校验集只查看 database的校验集指定编码创建数据库修改字符集修改校验集验证规则对数据库的影响utf8_general_ci ——不区分大小写utf8_bin ——区分大小…