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,一经查实,立即删除!

相关文章

系统分析师成长之路

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

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

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

区分Activity的四种加载模式

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

laravel常用响应操作

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

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

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

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

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

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

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

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

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

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

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

佳能g3800故障灯说明书_热水器维修电话|史密斯燃气热水器出现16故障码

热水器出现故障代码其实是一件很常见的事情&#xff0c;大多是住户的热水器都出现过这样的问题&#xff0c;为了防止这样的事情也发生在我身上&#xff0c;我熟读热水器说明书&#xff0c;终于参透其中的道理&#xff0c;那么接下来我为大家介绍史密斯燃气热水器出现16故障码。…

git语言包安装_Git分布式版本管理系统快速入门指南

为什么要使用版本管理系统无论有没有使用过专业化工具&#xff0c;每个人都或多或少地有版本管理的需求。我们在做论文、写报告或者设计方案时&#xff0c;因为难以避免的不断改动&#xff0c;总会形成很多个不同的版本&#xff0c;我们可能会用“某某设计方案_20180910”这样加…

(十)、java内部类与内部类的闭包和回调

一、成员内部类 1.可以把一个内部类看做是一个成员。成员内部类可以无条件访问外部类的所有成员属性和成员方法。 class OutterClass {//外部类private int in 0;static int inn4;public OutterClass(int in) {this.in in;}class InnerClass { //内部类public void outpu…

vb.net中滚动条一直显示没有数据时也显示_Android Studio 中 System Trace 的新增功能...

Android Studio 中 System Trace 的新增功能在 Android Studio 4.0 中&#xff0c;我们已经对 CPU Profiler 的 UI 做了大量调整来提供更加直观的工作流记录&#xff0c;而在 Android Studio 4.1 中&#xff0c;我们基于开发者们的反馈对此功能进行了持续改进&#xff0c;并且新…

第一节 Memcached分布式缓存入门

关于Memcached的博文太多了&#xff0c;以下是个人学习的收集整理。 本节讨论问题: 简单介绍与应用下载安装注意事项简单测试Memcached分布式原理 一、介绍与应用 在常规的WEB开发下&#xff0c;基本都会利用到缓存用以降低对数据库的压力&#xff0c;提高访问速度。有时候缓存…

tomcat 拦截指定url_一口气说出 过滤器 和 拦截器 6个区别,别再傻傻分不清了

点击“ 程序员内点事 ”关注&#xff0c;选择“ 设置星标 ”坚持学习&#xff0c;好文每日送达&#xff01;周末有个小伙伴加我微信&#xff0c;向我请教了一个问题&#xff1a;老哥&#xff0c;「过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊&#xff1f;」 听到题目我…

Java 多线程练习---创建两个子线程,每个线程交替输出“你好--来自线程***”...

|--需求说明 |--实现思路 1、创建一个类&#xff0c;实现Runnable&#xff0c;在这个类里面重写run()方法&#xff0c;在run()方法里面写一个20的for循环 2、创建一个类&#xff0c;实例化上面的类&#xff0c;用这个类的对象创建线程 |--代码内容 1 package cn.thread;2 3 /**…

js保留两位小数的函数_使用率低但功能强大的6个Excel函数公式应用技巧解读!...

在Excel函数公式中&#xff0c;有部分函数的使用率是比较低的&#xff0c;但是其功能也是非常强大的。一、Median函数。功能&#xff1a;返回一组数的中值。中值就是一组数的中间数值&#xff0c;如果参数包含的数值是偶数&#xff0c;Median函数将返回位于中间两个值的平均值。…

.net复习之七

表A&#xff1a; 表B&#xff1a; 1&#xff0e; SELECT * FROM A JOIN B ON A.Id B.Id 將顯示 9 條數據。 Inner join(等值连接)只返回两个表中联结字段相等的行 2&#xff0e; SELECT * FROM A LEFT JOIN B ON A.Id B.Id 將顯示 12 條數據…

原生js实现tab栏切换效果

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注小歌谣一起学习前后端知识 运行效果 首先我们来看一下原生js实现的效果 下面就开始直接上代码了 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

线程八大核心+java并发核心知识体系精讲_Java从业者如果不懂这些,面试80%都会挂在这些核心知识上面...

JVM无论什么级别的Java从业者&#xff0c;JVM都是进阶时必须迈过的坎。不管是工作还是面试中&#xff0c;JVM都是必考题。如果不懂JVM的话&#xff0c;薪酬会非常吃亏(近70%的面试者挂在JVM上了)详细介绍了JVM有关于线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种…