java笔记:自己动手写javaEE框架(七)--使用JSON和Ajax技术

  今天我要将json和ajax引入到我所写的框架,不过今天用到的技术有部分不是我框架最终使用到的技术,比如ajax技术,我用到的是最为原始的ajax技术,这次算是对老技术的回顾,不过不管技术如何演进,对技术的本质的掌握都是十分重要的。

  首先我简单介绍下json的基础知识。

  json的定义是:基于JavaScript语言的轻量级的数据交换格式(JavaScript Object Notiation)。(摘录于有道)

  JSON建构于两种结构:

  1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

  2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

  在我写到的架构里,前端和服务端的交互统一通过json来进行,这个做法符合我的观点,所有逻辑层的通讯都是通过键值对的方式进行,,参见我以前的博文:《系统设计与架构笔记:键值对在架构设计里的应用》

  下面我们继续写框架,首先我新建一张表,它的结构如下图:

 

  下面我将为这张表建立dao、service以及action,下面我将代码贴在下面(按我开发的过程):

  首先看看工程新的结构目录,如下图:

  1.首先是/ssiprj/src/cn/com/sharpxiajun/dao/sqlmap包下的映射文件PRODUCT.xml,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="PRODUCT">
<select id="queryProductList" parameterClass="java.util.Map" resultClass="java.util.HashMap">
select t.id,t.name,t.desc,t.create_date,t.modify_date,t.status from product t
<dynamic prepend="where">
<isNotEmpty prepend="and" property="name">
t.name = #name:VARCHAR#
</isNotEmpty>
</dynamic>
</select>
</sqlMap>

  2.在/ssiprj/conf包的SqlMapConfig.xml文件里添加PRODUCT.xml路径,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="true"
maxRequests
="64" maxSessions="20" maxTransactions="10"
useStatementNamespaces
="true"/>
<sqlMap resource="cn/com/sharpxiajun/dao/sqlmap/USERS.xml"/>
<sqlMap resource="cn/com/sharpxiajun/dao/sqlmap/PRODUCT.xml"/>
</sqlMapConfig>

  3.在cn.com.sharpxiajun.dao包下建立接口ProductDao,代码如下:

package cn.com.sharpxiajun.dao;

import java.util.List;
import java.util.Map;

public interface ProductDao {

public static final String QUERY_PRODUCT_LIST_SQL = "PRODUCT.queryProductList";

public List<Map<String, Object>> queryProductList(Map<String, Object> params) throws Exception;

}

  4.在cn.com.sharpxiajun.dao.impl包下实现接口ProductDao的类ProductDaoImpl,代码如下:

 

package cn.com.sharpxiajun.dao.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.stereotype.Repository;

import cn.com.sharpxiajun.dao.ProductDao;

@SuppressWarnings("unchecked")
@Scope("prototype")
@Repository("productDao")
public class ProductDaoImpl implements ProductDao {

@Autowired
@Qualifier("sqlMapClientTemplate")
private SqlMapClientTemplate sqlMapClientTemplate = null;

@Override
public List<Map<String, Object>> queryProductList(Map<String, Object> params)
throws Exception {
return this.sqlMapClientTemplate.queryForList(QUERY_PRODUCT_LIST_SQL, params);
}

}

  5.在cn.com.sharpxiajun.service包下建立接口ProductService,代码如下:

 

package cn.com.sharpxiajun.service;

import java.util.List;
import java.util.Map;

public interface ProductService {

public List<Map<String, Object>> queryProductList(Map<String, Object> params) throws Exception;

}

  6.在cn.com.sharpxiajun.service.impl包下建立ProductServiceImpl,他实现ProductService接口,代码如下:

package cn.com.sharpxiajun.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.com.sharpxiajun.dao.ProductDao;
import cn.com.sharpxiajun.service.ProductService;

@SuppressWarnings("unchecked")
@Scope("prototype")
@Transactional
@Service("productService")
public class ProductServiceImpl implements ProductService {

@Autowired
@Qualifier("productDao")
private ProductDao productDao = null;

@Override
public List<Map<String, Object>> queryProductList(Map<String, Object> params)
throws Exception {
return this.productDao.queryProductList(params);
}

}

  7.在cn.com.sharpxiajun.action包下建立ProductAction,代码如下:

package cn.com.sharpxiajun.action;


import java.sql.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;


import cn.com.sharpxiajun.common.action.BaseAction;
import cn.com.sharpxiajun.service.ProductService;

@SuppressWarnings("serial")
@Scope("prototype")
@Controller("productAction")
public class ProductAction extends BaseAction {

@Autowired
@Qualifier("productService")
private ProductService productService = null;

//输入值
private String namequery = null;

private Integer id = 0;
private String name = null;
private String desc = null;
private Date createDate = null;
private Date modifyDate = null;
private Boolean status = null;

//输出值
private List<Map<String, Object>> results = null;//返回查询的列表
private String msg = null;//系统运行信息
private String flag = null;//操作状态标记
private String welcome = null;//欢迎语

public String productinit() throws Exception
{
welcome = "欢迎使用本系统!";

return SUCCESS;
}

public String queryProductList() throws Exception
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", namequery);

results = this.productService.queryProductList(map);

flag = "success";
msg = "查询操作成功!";
welcome = "你的查询操作已经完成!";

return SUCCESS;
}


public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
public List<Map<String, Object>> getResults() {
return results;
}
public void setResults(List<Map<String, Object>> results) {
this.results = results;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getWelcome() {
return welcome;
}
public void setWelcome(String welcome) {
this.welcome = welcome;
}

public String getNamequery() {
return namequery;
}

public void setNamequery(String namequery) {
this.namequery = namequery;
}

}

  8.在WEB-INF\jsp包下,建立product.jsp文件,代码如下:

  要在struts2程序里使用json,首先http://code.google.com/p/jsonplugin/downloads/list下载JSON插件的JAR包,我下载的版本是jsonplugin-0.34.jar,把jar包加入到工程的lib里,修改conf包下的struts-action.xml文件,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd"
>
<struts>
<package name="action" extends ="struts-default">
<action name="queryUsersList" class="usersAction" method="queryUsersList">
<result name="success">/WEB-INF/jsp/users.jsp</result>
</action>
<action name="usersinit" class="usersAction" method="usersinit">
<result name="success">/WEB-INF/jsp/users.jsp</result>
</action>
<action name="addUsers" class="usersAction" method="addUsers">
<result name="success">/WEB-INF/jsp/users.jsp</result>
<result name="error">/WEB-INF/common/error.jsp</result>
</action>
</package>
<package name="json" extends ="json-default">
<action name="productinit" class="productAction" method="productinit">
<result name="success">/WEB-INF/jsp/product.jsp</result>
</action>
<action name="queryProductList" class="productAction" method="queryProductList">
<result name="success" type="json"></result>
</action>
</package>
</struts>

  上面配置文件的“package”元素和以往不同的是,它扩展了“json-default”而不是“struts-default”。“json-default”是在jsonplugin-0.34.jar包里的struts-plugin.xml中定义的。该文件同时定义了“json”的结果类型,有兴趣的朋友可以打开此文件看看。

  下面我们启动tomcat服务器,在浏览器地址栏里填入下面地址:http://localhost:8080/ssiprj/productinit.action

  页面如下图:

 

 

  点击按钮query,结果是:

  选择用记事本打开,显示结果如下:

 

{"createDate":null,"desc":null,"flag":"success","id":0,"modifyDate":null,"msg":"查询操作成功!","name":null,"namequery":"","results":

[{"id":1,"desc":"apple","create_date":"2011-10-28T00:00:00","status":true,"modify_date":"2011-10-28T00:00:00","name":"ipad"},

{"id":2,"desc":"google","create_date":"2011-10-28T00:00:00","status":true,"modify_date":"2011-10-28T00:00:00","name":"android"}],"status":null,"welcome":"你的查询操作

已经完成!"}

  结果居然是一个下载的文本文件,这个不符合我们的要求,下面我用ajax技术来处理这些返回结果。

  AJAX技术:服务端返回客户端JSON数据

  上面的例子里,我们服务端程序返回到前端页面的数据格式是json方式,下面的程序就是使用ajax来访问服务端程序并且展示页面如何处理json对象,这里我们只需要修改product.jsp代码,代码如下:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSON</title>
</head>
<body>
名称:<input type="text" id="namequery" name="namequery"/> &nbsp;&nbsp;<input type="button" onClick="queryBtnClick();" value="query"/>
<div id="datashow"></div>
</body>
</html>
<script src="<%= request.getContextPath()%>/js/json.js"/></script>
<script type="text/javascript">
var xmlHttp;//XMLHttpRequest对象

//创建XMLHttpRequest对象
function createXMLHttpRequest()
{
if (window.ActiveXobject)
{
xmlHttp
=new ActiveXOject('Microsoft.XMLHTTP');
}
elseif (window.XMLHttpRequest)
{
xmlHttp
=new XMLHttpRequest();
}
}

//查询操作
function queryBtnClick()
{
var url ="queryProductList.action";
createXMLHttpRequest();
xmlHttp.open(
"POST",url,true);
xmlHttp.onreadystatechange
= jsonCallBack;
xmlHttp.setRequestHeader(
"Content-Type","application/x-www-form-urlencoded;");//使用POST传递信息时候用到的
xmlHttp.send(null);
}

//处理返回数据的回调函数
function jsonCallBack()
{
if (xmlHttp.readyState ==4)
{
if (xmlHttp.status ==200)
{
parseResults();
}
}
}

//处理返回数据的方法
function parseResults()
{
var product = eval('('+ xmlHttp.responseText +')');
var showstr ="<table border='1'>";
for (var i =0;i < product.results.length;i++)
{
obj
= product.results[i];
showstr
+='<tr>';
showstr
+='<td>'+ obj.id +'</td>';
showstr
+='<td>'+ obj.name +'</td>';
showstr
+='<td>'+ obj.desc +'</td>';
showstr
+='<td>'+ obj.create_date +'</td>';
showstr
+='<td>'+ obj.modify_date +'</td>';
showstr
+='<td>'+ obj.status +'</td>';
showstr
+='</tr>';
}
showstr
+='</table>';
document.getElementById(
'datashow').innerHTML = showstr;
}

</script>

  这次提交服务端请求里没有放入任何参数,也就是说前端没有传参数到服务端,因此这个测试代码就是展示ajax是如何调用的以及如何处理返回数据是json格式的数据,我们点击页面的query按钮,结果如下:

 

  大家看到了数据成功返回并且被正确处理。

  AJAX技术:客户端传给服务端JSON数据

  大家在http://www.json.org/网站里下载json.js脚本以及json在java里的操作类,我下载了这些文件,把他们放到我写的工程里,结果如下:

 

 

  (我发现我的jsp文件夹放的位置不对了,导致最后在struts-action.xml里面放回页面前还要加/WEB-INF/,哎,算了,将错就错吧!)

  我们修改ProductAction.java文件,代码如下:

 

package cn.com.sharpxiajun.action;


import java.sql.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;


import cn.com.sharpxiajun.common.action.BaseAction;
import cn.com.sharpxiajun.common.util.JSONObject;
import cn.com.sharpxiajun.service.ProductService;

@SuppressWarnings("serial")
@Scope("prototype")
@Controller("productAction")
public class ProductAction extends BaseAction {

@Autowired
@Qualifier("productService")
private ProductService productService = null;

//输入值
private String namequery = null;

private Integer id = 0;
private String name = null;
private String desc = null;
private Date createDate = null;
private Date modifyDate = null;
private Boolean status = null;

private String jsonQuery = null;//获得json格式的参数

//输出值
private List<Map<String, Object>> results = null;//返回查询的列表
private String msg = null;//系统运行信息
private String flag = null;//操作状态标记
private String welcome = null;//欢迎语

public String productinit() throws Exception
{
welcome = "欢迎使用本系统!";

return SUCCESS;
}

public String queryProductList() throws Exception
{
Map<String, Object> map = new HashMap<String, Object>();
//map.put("name", namequery);

JSONObject jsonObject = new JSONObject(jsonQuery);//把查询参数转化为json对象

map.put("name", jsonObject.get("namequery"));

results = this.productService.queryProductList(map);

flag = "success";
msg = "查询操作成功!";
welcome = "你的查询操作已经完成!";

return SUCCESS;
}


public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
public List<Map<String, Object>> getResults() {
return results;
}
public void setResults(List<Map<String, Object>> results) {
this.results = results;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getWelcome() {
return welcome;
}
public void setWelcome(String welcome) {
this.welcome = welcome;
}

public String getNamequery() {
return namequery;
}

public void setNamequery(String namequery) {
this.namequery = namequery;
}

public String getJsonQuery() {
return jsonQuery;
}

public void setJsonQuery(String jsonQuery) {
this.jsonQuery = jsonQuery;
}

}

  修改页面product.jsp,代码如下:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSON</title>
</head>
<body>
名称:<input type="text" id="namequery" name="namequery"/> &nbsp;&nbsp;<input type="button" onClick="queryBtnClick();" value="query"/>
<div id="datashow"></div>
</body>
</html>
<script src="<%= request.getContextPath()%>/js/json.js"/></script>
<script type="text/javascript">
var xmlHttp;//XMLHttpRequest对象

//创建XMLHttpRequest对象
function createXMLHttpRequest()
{
if (window.ActiveXobject)
{
xmlHttp
=new ActiveXOject('Microsoft.XMLHTTP');
}
elseif (window.XMLHttpRequest)
{
xmlHttp
=new XMLHttpRequest();
}
}

//查询操作
function queryBtnClick()
{
var url ="queryProductList.action";
createXMLHttpRequest();
xmlHttp.open(
"POST",url,true);
xmlHttp.onreadystatechange
= jsonCallBack;
var obj = getQueryParams();//获取查询参数对象
var queryJson ="jsonQuery="+ JSON.stringify(obj);//构建查询参数
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");//使用POST传递信息时候用到的
xmlHttp.send(queryJson);//将参数发送到服务端
}

//处理返回数据的回调函数
function jsonCallBack()
{
if (xmlHttp.readyState ==4)
{
if (xmlHttp.status ==200)
{
parseResults();
}
}
}

//处理返回数据的方法
function parseResults()
{
var product = eval('('+ xmlHttp.responseText +')');
var showstr ="<table border='1'>";
for (var i =0;i < product.results.length;i++)
{
obj
= product.results[i];
showstr
+='<tr>';
showstr
+='<td>'+ obj.id +'</td>';
showstr
+='<td>'+ obj.name +'</td>';
showstr
+='<td>'+ obj.desc +'</td>';
showstr
+='<td>'+ obj.create_date +'</td>';
showstr
+='<td>'+ obj.modify_date +'</td>';
showstr
+='<td>'+ obj.status +'</td>';
showstr
+='</tr>';
}
showstr
+='</table>';
document.getElementById(
'datashow').innerHTML = showstr;
}

//获取查询参数对象
function getQueryParams()
{
returnnew queryObj();
}

//构建查询参数类
function queryObj()
{
this.namequery = document.getElementById('namequery').value;
}
</script>

  代码里面我写了注释,这里就不做过多解释了。

  我们在浏览器地址栏里录入:http://localhost:8080/ssiprj/productinit.action,在名称框里录入ipad,点击query查询按钮,结果如下:

 

  控制台打印日志:

|statement| select t.id,t.name,t.desc,t.create_date,t.modify_date,t.status from product t where t.name = 'ipad' 
|resultset|
|commit|
返回结果是:
[{id=1, desc=apple, create_date=2011-10-28, status=true, modify_date=2011-10-28, name=ipad}]
拦截器执行结束!!

  操作成功了!!!!

  最后总结下了:struts2把返回给客户端的数据封装成json格式,前端再处理,这个做起来很自然,也带来了编写代码的便利,但是从客户端到服务端这种做法就有点奇怪了,至少没有看到便利之处,当然今天写的代码都很简单,没有把许多功能抽象出来,不管怎样,让action把返回值封装成json,前端的参数也封装成json格式这就是我的框架里面所追求的。下一篇文章我将引入jquery了,为了展示数据我会使用到jqgrid,下一个阶段我将着重写写前端技术。

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/sharpxiajun/archive/2011/10/29/2228290.html

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

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

相关文章

[html] pre与xmp标签有什么区别?

[html] pre与xmp标签有什么区别&#xff1f; xmp的标签&#xff0c;会复把抱在内部的html片段当作字符串输出&#xff08;此标签已废弃&#xff09; <pre></pre> 标签&#xff0c;可以在保留原来文本格式的基础制上让文本在页面上显示出来 <pre> 标签中的特…

系统分析师成长之路

去年拿到软件设计师证书后&#xff0c;查了下高级认证中系统分析师&#xff0c;原来发现自己目前工作内容更像系统分析师&#xff08;与用户调研、明确需求内容、熟悉企业数据模型、安排开发人员设计程序、牵头日常维护工作、团队人员管理&#xff09;。去年底马上下决定趁热打…

python 收发邮件_python发送各类邮件的主要基本方法

利用python实现基本的邮件发送。 感谢以下博客的整理&#xff0c;本人在学习的同时也做了一些整理 一、相关模块介绍 发送邮件主要用到了smtplib和email两个模块&#xff0c;这里首先就两个模块进行一下简单的介绍&#xff1a; 1、smtplib模块 smtplib.SMTP([host[, port[, loc…

[html] websocket握手阶段是通过什么协议传输的?

[html] websocket握手阶段是通过什么协议传输的&#xff1f; HTTP个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

区分Activity的四种加载模式

在多Activity开发中&#xff0c;有可能是自己应用之间的Activity跳转&#xff0c;或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例&#xff0c;而不是产生大量重复的Activity。 这需要为Activity配置特定的加载模式&#xff0c;而不是使用默认的加载模…

laravel常用响应操作

转载于:https://www.cnblogs.com/saintdingspage/p/11298246.html

[html] 说说你对Media Source Extensions(MSE)的理解,它解决了什么问题呢?

[html] 说说你对Media Source Extensions(MSE)的理解&#xff0c;它解决了什么问题呢&#xff1f; Media Source Extensions 允许JavaScript动态地为<audio>和<video>创建媒体流&#xff0c;而不再只能是引用一个视频文件的url。这样就极大地丰富了前端对音视频的…

教学思路SQL之入门习题《学生成绩》 二、基础单表查询

根据查询要求&#xff0c;写出SQL脚本&#xff1a; 1、 查询学生信息表&#xff0c;查找学生的姓名&#xff0c;性别&#xff0c;并将查询结果按姓名进行排序。 2、查询学生信息表&#xff0c;查找地区在大连的学生&#xff0c;显示其姓名&#xff0c;联系电话&#xff0c;地…

python中mat函数_python matplotlib中的subplot函数使用详解

python里面的matplotlib.pylot是大家比较常用的&#xff0c;功能也还不错的一个包。基本框架比较简单&#xff0c;但是做一个功能完善且比较好看整洁的图&#xff0c;免不了要网上查找一些函数。于是&#xff0c;为了节省时间&#xff0c;可以一劳永逸。我把常用函数作了一个总…

pytorch资料

torchvision是独立于pytorch的关于图像操作的一些方便工具库。 torchvision的详细介绍在&#xff1a;https://pypi.org/project/torchvision/ torchvision主要包括一下几个包&#xff1a; vision.datasets : 几个常用视觉数据集&#xff0c;可以下载和加载&#xff0c;这里主要…

[html] 浏览器是怎么对HTML5的离线储存资源进行管理和加载的

[html] 浏览器是怎么对HTML5的离线储存资源进行管理和加载的 在线的情况下&#xff0c;浏览器发现html头部有manifest属性&#xff0c;它会请求manifest文件&#xff0c;如果是第一次访问app&#xff0c;那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。…

常用技术面试题

java面试题 http://blog.csdn.net/uiop_7890_7890转载于:https://www.cnblogs.com/ajian005/archive/2011/11/02/2753780.html

if else if else语句格式_你还在用if/else吗?

你还在用if/else吗&#xff1f;前提我们在日常开发当中经常会遇到复杂的条件判断&#xff0c;一般的做法是用if/else&#xff0c;或者优雅一点的写法是用switch语句来实现多个条件的判断&#xff0c;这样的话会有很多问题&#xff0c;随着判断条件的增加&#xff0c;代码中if/e…

魔术球问题

题目大意&#xff1a; 有 \(n\) 个柱子&#xff0c;依次将若干个球放上去&#xff0c;要满足&#xff1a; 1.每次只能放在柱子的顶端 2.相邻两个球的编号之和必须为完全平方数。 问最多能放几个球&#xff1f; \((1 \leq n \leq 55)\) 思路&#xff1a; 首先&#xff0c;答案一…

[html] svg如何转为字体图标?

[html] svg如何转为字体图标&#xff1f; 选择一个支持在线转换的网站 如IconFont或icomoon上传svg文件的图标在相应的地方进行下载好处字体图标直接用color自由控制颜色&#xff1b;整合在一起&#xff0c;减少http请求等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后…

乔梁专访——让持续交付变为可能

本月起&#xff0c;图灵社区陆续推出专业IT人访谈版块&#xff0c;首期人物是百度公司项目管理部高级架构师、《持续交付》译者乔梁。   本次访谈分三个主题&#xff1a;   1、 从概念和技术两个层次来解释持续交付   2、.持续交付是可实施的   3、持续交付将变成必备…

java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)

对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。那到底应该怎么学习并发编程呢? Java SDK的并发工具包有很多,是…

移动端安全 - 安卓Android - 漏洞修复方案整理

敏感数据泄露 明文传输用户名、密码和验证码等敏感信息 MD5/Base64弱加密传输手机、密码等敏感信息 敏感信息在本地加密存储 后台服务器地址泄露。 边信道信息泄漏 在日志中对于密码等敏感信息进行加密存储。 关闭调试接口&#xff0c;禁止输出敏感信息。 未经用户确认调用敏感…

[html] html中如何使用svg?

[html] html中如何使用svg&#xff1f; 1-使用embed标签 推荐优点主流浏览器都支持允许使用脚本缺点不推荐在HTML4和XHTML中使用语法<embed src"svg File Path" type"image/svgxml" width"width" height"height" pluginspage&quo…

element中select默认选中第一个_探索在网页中使用“标注”

github地址&#xff1a;https://github.com/1314mxc/yunUI &#xff0c;欢迎star&#xff01;说起“标注”&#xff0c;在HTML5之前&#xff0c;你可能想起的是各种浏览器插件&#xff0c;emmmmmmm或者说你根本不认为浏览器上可以有这种玩意。但是HTML5来了&#xff0c;这是它的…