当前位置: 首页 > 编程日记 > 正文

第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

原创内容,转载请注明iteye http://jinnianshilongnian.iteye.com/

4.15、MultiActionController

之前学过的控制器如AbstractCommandController、SimpleFormController等一般对应一个功能处理方法(如新增),如果我要实现比如最简单的用户增删改查(CRUD Create-Read-Update-Delete),那该怎么办呢?

4.15.1 解决方案

1、每一个功能对应一个控制器,如果是CRUD则需要四个控制器,但这样我们的控制器会暴增,肯定不可取;

2、使用Spring Web MVC提供的MultiActionController,用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,这种方式不错。

4.15.2 问题

1、  MultiActionController如何将不同的请求映射不同的请求的功能处理方法呢?

Spring Web MVC提供了MethodNameResolver(方法名解析器)用于解析当前请求到需要执行的功能处理方法的方法名。默认使用InternalPathMethodNameResolver实现类,另外还提供了ParameterMethodNameResolverPropertiesMethodNameResolver,当然我们也可以自己来实现,稍候我们仔细研究下它们是如何工作的。

 

2、那我们的功能处理方法应该怎么写呢?

public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);

 

哦,原来如此,我们只需要按照如上格式写我们的功能处理方法即可;此处需要注意一下几点:

1、返回值:即模型和视图部分;

ModelAndView:模型和视图部分,之前已经见过了;

Map:只返回模型数据,逻辑视图名会根据RequestToViewNameTranslator实现类来计算,稍候讨论;

String:只返回逻辑视图名;

void:表示该功能方法直接写出response响应(如果其他返回值类型(如Map)返回null则和void进行相同的处理);

2actionName功能方法名字;由methodNameResolver根据请求信息解析功能方法名,通过反射调用;

3、形参列表:顺序固定,“[]”表示可选,我们来看看几个示例吧:

//表示到新增页面

public ModelAndView toAdd(HttpServletRequest request, HttpServletResponse response);

//表示新增表单提交,在最后可以带着命令对象

public ModelAndView add(HttpServletRequest request, HttpServletResponse response, UserModel user);

//列表,但只返回模型数据,视图名会通过RequestToViewNameTranslator实现来计算

public Map list(HttpServletRequest request, HttpServletResponse response);

//文件下载,返回值类型为void,表示该功能方法直接写响应

public void fileDownload(HttpServletRequest request, HttpServletResponse response)

//第三个参数可以是session

public ModelAndView sessionWith(HttpServletRequest request, HttpServletResponse response, HttpSession session);

//如果第三个参数是session,那么第四个可以是命令对象,顺序必须是如下顺序

public void sessionAndCommandWith(HttpServletRequest request, HttpServletResponse response, HttpSession session, UserModel user)

4、异常处理方法,MultiActionController提供了简单的异常处理,即在请求的功能处理过程中遇到异常会交给异常处理方法进行处理,式如下所示:

public ModelAndView anyMeaningfulName(HttpServletRequest request, HttpServletResponse response, ExceptionClass exception)

MultiActionController会使用最接近的异常类型来匹配对应的异常处理方法,示例如下所示:

//处理PayException

public ModelAndView processPayException(HttpServletRequest request, HttpServletResponse response, PayException ex)

//处理Exception

public ModelAndView processException(HttpServletRequest request, HttpServletResponse response,  Exception ex)

4.15.3 MultiActionController类实现

类定义:public class MultiActionController extends AbstractController implements LastModified ,继承了AbstractController,并实现了LastModified接口,默认返回-1;

核心属性:

delegate功能处理的委托对象,即我们要调用请求处理方法所在的对象,默认是this;

methodNameResolver功能处理方法名解析器,即根据请求信息来解析需要执行的delegate的功能处理方法的方法名。

核心方法:

//判断方法是否是功能处理方法
private boolean isHandlerMethod(Method method) {//得到方法返回值类型Class returnType = method.getReturnType();//返回值类型必须是ModelAndView、Map、String、void中的一种,否则不是功能处理方法if (ModelAndView.class.equals(returnType) || Map.class.equals(returnType) || String.class.equals(returnType) ||void.class.equals(returnType)) {Class[] parameterTypes = method.getParameterTypes();//功能处理方法参数个数必须>=2,且第一个是HttpServletRequest类型、第二个是HttpServletResponse//且不能Controller接口的handleRequest(HttpServletRequest request, HttpServletResponse response),这个方法是由系统调用return (parameterTypes.length >= 2 &&HttpServletRequest.class.equals(parameterTypes[0]) &&HttpServletResponse.class.equals(parameterTypes[1]) &&!("handleRequest".equals(method.getName()) && parameterTypes.length == 2));}return false;
}

//是否是异常处理方法
private boolean isExceptionHandlerMethod(Method method) {//异常处理方法必须是功能处理方法 且 参数长度为3、第三个参数类型是Throwable子类return (isHandlerMethod(method) &&method.getParameterTypes().length == 3 &&Throwable.class.isAssignableFrom(method.getParameterTypes()[2]));
}
private void registerHandlerMethods(Object delegate) {//缓存Map清空this.handlerMethodMap.clear();this.lastModifiedMethodMap.clear();this.exceptionHandlerMap.clear();//得到委托对象的所有public方法Method[] methods = delegate.getClass().getMethods();for (Method method : methods) {//验证是否是异常处理方法,如果是放入exceptionHandlerMap缓存mapif (isExceptionHandlerMethod(method)) {registerExceptionHandlerMethod(method);}//验证是否是功能处理方法,如果是放入handlerMethodMap缓存mapelse if (isHandlerMethod(method)) {registerHandlerMethod(method);registerLastModifiedMethodIfExists(delegate, method);}}
}
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)throws Exception {try {//1、使用methodNameResolver 方法名解析器根据请求解析到要执行的功能方法的方法名String methodName = this.methodNameResolver.getHandlerMethodName(request);//2、调用功能方法(通过反射调用,此处就粘贴代码了)return invokeNamedMethod(methodName, request, response);}catch (NoSuchRequestHandlingMethodException ex) {return handleNoSuchRequestHandlingMethod(ex, request, response);}
}

接下来,我们看一下MultiActionController如何使用MethodNameResolver来解析请求到功能处理方法的方法名。

4.15.4 MethodNameResolver

1、InternalPathMethodNameResolver:MultiActionController的默认实现,提供从请求URL路径解析功能方法的方法名,从请求的最后一个路径(/)开始,并忽略扩展名;如请求URL是“/user/list.html”,则解析的功能处理方法名为“list”,即调用list方法。该解析器还可以指定前缀和后缀,通过prefix和suffix属性,如指定prefix=”test_”,则功能方法名将变为test_list;

 

2、ParameterMethodNameResolver:提供从请求参数解析功能处理方法的方法名,并按照如下顺序进行解析:

(1、 methodParamNames:根据请求的参数名解析功能方法名(功能方法名和参数名同名);

<property name="methodParamNames" value="list,create,update"/>       

  如上配置时,如果请求中含有参数名list、create、update时,则功能处理方法名为list、create、update,这种方式的可以在当一个表单有多个提交按钮时使用,不同的提交按钮名字不一样即可。

  ParameterMethodNameResolver也考虑到图片提交按钮提交问题:

    <input type="image" name="list"> 和submit类似可以提交表单,单击该图片后会发送两个参数“list.x=x轴坐标”和“list.y=y轴坐标”(如提交后会变为list.x=7&list.y=5);因此我们配置的参数名(如list)在会加上“.x” 和 “.y”进行匹配。

for (String suffix : SUBMIT_IMAGE_SUFFIXES)  {//SUBMIT_IMAGE_SUFFIXES {“.x”, “.y”}if (request.getParameter(name + suffix) != null) {// name是我们配置的methodParamNamesreturn true;}
}

(2、paramName:根据请求参数名的值解析功能方法名,默认的参数名是action,即请求的参数中含有“action=query”,则功能处理方法名为query;

(3、logicalMappings:逻辑功能方法名到真实功能方法名映射,如下所示:

<property name="logicalMappings"><props><prop key="doList">list</prop></props></property>

  即如果步骤1或2解析出逻辑功能方法名为doList(逻辑的),将会被重新映射为list功能方法名(真正执行的)。

(4、defaultMethodName:默认的方法名,当以上策略失败时默认调用的方法名。

 

3、PropertiesMethodNameResolver:提供自定义的从请求URL解析功能方法的方法名,使用一组用户自定义的模式到功能方法名的映射,映射使用Properties对象存放,具体配置示例如下:

<bean id="propertiesMethodNameResolver" 
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"><property name="mappings"><props><prop key="/create">create</prop><prop key="/update">update</prop><prop key="/delete">delete</prop><prop key="/list">list</prop><!-- 默认的行为 --><prop key="/**">list</prop></props></property>
</bean> 

对于/create请求将调用create方法,Spring内部使用PathMatcher进行匹配(默认实现是AntPathMatcher)。

4.15.5 RequestToViewNameTranslator

用于直接将请求转换为逻辑视图名。默认实现为DefaultRequestToViewNameTranslator。

1、DefaultRequestToViewNameTranslator:将请求URL转换为逻辑视图名,默认规则如下:

  http://localhost:9080/web上下文/list -------> 逻辑视图名为list

  http://localhost:9080/web上下文/list.html -------> 逻辑视图名为list(默认删除扩展名)

  http://localhost:9080/web上下文/user/list.html -------> 逻辑视图名为user/list

4.15.6 示例

(1、控制器UserController

package cn.javass.chapter4.web.controller;
//省略import
public class UserController extends MultiActionController {//用户服务类private UserService userService;//逻辑视图名 通过依赖注入方式注入,可配置private String createView;private String updateView;private String deleteView;private String listView;private String redirectToListView;//省略setter/getterpublic String create(HttpServletRequest request, HttpServletResponse response, UserModel user) {if("GET".equals(request.getMethod())) {//如果是get请求 我们转向 新增页面return getCreateView();}userService.create(user);//直接重定向到列表页面return getRedirectToListView();}public ModelAndView update(HttpServletRequest request, HttpServletResponse response, UserModel user) {if("GET".equals(request.getMethod())) {//如果是get请求 我们转向更新页面ModelAndView mv = new ModelAndView();//查询要更新的数据mv.addObject("command", userService.get(user.getUsername()));mv.setViewName(getUpdateView());return mv;}userService.update(user);//直接重定向到列表页面return new ModelAndView(getRedirectToListView());}public ModelAndView delete(HttpServletRequest request, HttpServletResponse response, UserModel user) {if("GET".equals(request.getMethod())) {//如果是get请求 我们转向删除页面ModelAndView mv = new ModelAndView();//查询要删除的数据mv.addObject("command", userService.get(user.getUsername()));mv.setViewName(getDeleteView());return mv;}userService.delete(user);//直接重定向到列表页面return new ModelAndView(getRedirectToListView());}	public ModelAndView list(HttpServletRequest request, HttpServletResponse response) {ModelAndView mv = new ModelAndView();mv.addObject("userList", userService.list());mv.setViewName(getListView());return mv;}//如果使用委托方式,命令对象名称只能是commandprotected String getCommandName(Object command) {//命令对象的名字 默认commandreturn "command";}
}

  增删改:如果是GET请求方法,则表示到展示页面,POST请求方法表示真正的功能操作;

  getCommandName:表示是命令对象名字,默认command,对于委托对象实现方式无法改变,因此我们就使用默认的吧。

 

(2、spring配置文件chapter4-servlet.xml

<bean id="userService" class="cn.javass.chapter4.service.UserService"/><bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController"><property name="userService" ref="userService"/><property name="createView" value="user/create"/><property name="updateView" value="user/update"/><property name="deleteView" value="user/delete"/><property name="listView" value="user/list"/><property name="redirectToListView" value="redirect:/user/list"/><!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->       <!--property name="methodNameResolver" ref="propertiesMethodNameResolver"/--></bean>

  userService:用户服务类,实现业务逻辑;

  依赖注入:对于逻辑视图页面通过依赖注入方式注入,redirectToListView表示增删改成功后重定向的页面,防止重复表单提交;

  默认使用InternalPathMethodNameResolver解析请求URL到功能方法名。

 

(3、视图页面

(3.1、list页面(WEB-INF/jsp/user/list.jsp)

<a href="${pageContext.request.contextPath}/user/create">用户新增</a><br/>
<table border="1" width="50%"><tr><th>用户名</th><th>真实姓名</th><th>操作</th></tr> <c:forEach items="${userList}" var="user"><tr><td>${user.username }</td><td>${user.realname }</td><td><a href="${pageContext.request.contextPath}/user/update?username=${user.username}">更新</a>|<a href="${pageContext.request.contextPath}/user/delete?username=${user.username}">删除</a></td></tr></c:forEach>   
</table>

(3.2、update页面(WEB-INF/jsp/user/update.jsp)

<form action="${pageContext.request.contextPath}/user/update" method="post">
用户名: <input type="text" name="username" value="${command.username}"/><br/>
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>
<input type="submit" value="更新"/>
</form>

(4、测试:

默认的InternalPathMethodNameResolver将进行如下解析:

http://localhost:9080/springmvc-chapter4/user/list————>list方法名;

http://localhost:9080/springmvc-chapter4/user/create————>create方法名;

http://localhost:9080/springmvc-chapter4/user/update————>update功能处理方法名;

http://localhost:9080/springmvc-chapter4/user/delete————>delete功能处理方法名。

 

我们可以将默认的InternalPathMethodNameResolver改为PropertiesMethodNameResolver

<bean id="propertiesMethodNameResolver" 
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"><property name="mappings"><props><prop key="/user/create">create</prop><prop key="/user/update">update</prop><prop key="/user/delete">delete</prop><prop key="/user/list">list</prop><prop key="/**">list</prop><!-- 默认的行为 --></props></property><property name="alwaysUseFullPath" value="false"/><!-- 不使用全路径 -->
</bean>   
<bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController"><!—省略其他配置,详见配置文件--><!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->       <property name="methodNameResolver" ref="propertiesMethodNameResolver"/>
</bean>

 /**表示默认解析到list功能处理方法。

如上配置方式可以很好的工作,但必须继承MultiActionController,Spring Web MVC提供给我们无需继承MultiActionController实现方式,即使有委托对象方式,继续往下看吧。

4.15.7、委托方式实现

(1、控制器UserDelegate

   将UserController复制一份,改名为UserDelegate,并把继承MultiActionController去掉即可,其他无需改变。

(2、spring配置文件chapter4-servlet.xml 

<!—委托对象-->
<bean id="userDelegate" class="cn.javass.chapter4.web.controller.UserDelegate"><property name="userService" ref="userService"/><property name="createView" value="user2/create"/><property name="updateView" value="user2/update"/><property name="deleteView" value="user2/delete"/><property name="listView" value="user2/list"/><property name="redirectToListView" value="redirect:/user2/list"/>
</bean>
<!—控制器对象-->
<bean name="/user2/**" 
class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<property name="delegate" ref="userDelegate"/><property name="methodNameResolver" ref="parameterMethodNameResolver"/>
</bean>

 delegate控制器对象通过delegate属性指定委托对象,即实际调用delegate委托对象的功能方法。

 methodNameResolver此处我们使用ParameterMethodNameResolver解析器;

<!—ParameterMethodNameResolver -->
<bean id="parameterMethodNameResolver" 
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<!-- 1、根据请求参数名解析功能方法名 --><property name="methodParamNames" value="create,update,delete"/><!-- 2、根据请求参数名的值解析功能方法名 --><property name="paramName" value="action"/>
<!-- 3、逻辑方法名到真实方法名的映射 --><property name="logicalMappings"><props><prop key="doList">list</prop></props></property><!—4、默认执行的功能处理方法 --><property name="defaultMethodName" value="list"/>
</bean>

1、methodParamNamescreate,update,delete,当请求中有参数名为这三个的将被映射为功能方法名,如“<input type="submit" name="create" value="新增"/>”提交后解析得到的功能方法名为create;

2、paramName:当请求中有参数名为action,则将值映射为功能方法名,如“<input type="hidden" name="action" value="delete"/>”,提交后解析得到的功能方法名为delete;

3、logicalMappings:逻辑功能方法名到真实功能方法名的映射,如:

    http://localhost:9080/springmvc-chapter4/user2?action=doList

    首先请求参数“action=doList”,则第二步解析得到逻辑功能方法名为doList;

    本步骤会把doList再转换为真实的功能方法名list。

4、defaultMethodName:以上步骤如果没有解析到功能处理方法名,默认执行的方法名。

 

(3、视图页面

(3.1、list页面(WEB-INF/jsp/user2/list.jsp)

<a href="${pageContext.request.contextPath}/user2?action=create">用户新增</a><br/>
<table border="1" width="50%"><tr><th>用户名</th><th>真实姓名</th><th>操作</th></tr> <c:forEach items="${userList}" var="user"><tr><td>${user.username }</td><td>${user.realname }</td><td><a href="${pageContext.request.contextPath}/user2?action=update&username=${user.username}">更新</a>|<a href="${pageContext.request.contextPath}/user2?action=delete&username=${user.username}">删除</a></td></tr></c:forEach>   
</table> 

(3.2、update页面(WEB-INF/jsp/user2/update.jsp)

<form action="${pageContext.request.contextPath}/user2" method="post">
<input type="hidden" name="action" value="update"/>
用户名: <input type="text" name="username" value="${command.username}"/><br/>
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>
<input type="submit" value="更新"/>
</form> 

  通过参数name="action" value="update"来指定要执行的功能方法名update。

 

(3.3、create页面(WEB-INF/jsp/user2/create.jsp)

<form action="${pageContext.request.contextPath}/user2" method="post">
用户名: <input type="text" name="username" value="${command.username}"/><br/>
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>
<input type="submit" name="create" value="新增"/>
</form> 

  通过参数name="create"来指定要执行的功能方法名create。

(4、测试:

使用ParameterMethodNameResolver将进行如下解析:

http://localhost:9080/springmvc-chapter4/user2?create      ————>create功能处理方法名(参数名映射);

http://localhost:9080/springmvc-chapter4/user2?action=create————>create功能处理方法名(参数值映射);

http://localhost:9080/springmvc-chapter4/user2?update      ————>update功能处理方法名;

http://localhost:9080/springmvc-chapter4/user2?action=update————>update功能处理方法名;

http://localhost:9080/springmvc-chapter4/user2?delete      ————>delete功能处理方法名;

http://localhost:9080/springmvc-chapter4/user2?action=delete————>delete功能处理方法名;

http://localhost:9080/springmvc-chapter4/user2?doList      ————>通过logicalMappings解析为list功能处理方法。

http://localhost:9080/springmvc-chapter4/user2?action=doList————>通过logicalMappings解析为list功能处理方法。

 

http://localhost:9080/springmvc-chapter4/user2————>默认的功能处理方法名list(默认)。

原创内容,转载请注明iteye http://jinnianshilongnian.iteye.com/

转载于:https://my.oschina.net/u/2317688/blog/530199

相关文章:

自动机器学习:团队如何在自动学习项目中一起工作?(附链接)

来源 | 数据派THU作者 | Francesca Lazzeri翻译 | 王琦责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;去年11月&#xff0c;我写了一篇关于使用自动机器学习来进行AI民主化&#xff08;democratization&#xff09;的文章&#xff08;见下面链接&#x…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入

操作系统是ubuntu 18.04.1 server amd64&#xff0c;gcc是 7.3.0。编译产出是64位测试程序。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 因为加入测量&#xff0c;就会导致误差。我已经尽量将环境影响降低&#xff0c;但是还是难免有误差。大家可以通过文…

SSIS中的记录集目标

这一篇&#xff0c;我们来看看另外一个特殊的目标组件&#xff1a;记录集目标。它与DataReader目标有些类似&#xff0c;也是在内存中的。但与DataReader目标不同的是&#xff0c;它可以被下游任务使用。 它的使用也比较简单&#xff0c;我们一般指定一个变量来接收它的结果&am…

Leetcode: Maximum Depth of Binary Tree

题目&#xff1a;算出二叉树的最大深度 解决方案&#xff1a;&#xff08;1&#xff09;BFS &#xff08;2&#xff09;DFS (1)BFS 一层一层往下搜索&#xff0c;一直找到最深的点&#xff0c;这里由于节点的val是没有用的&#xff0c;所以可以用来存储当前节点的深度&#xff…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;ubuntu g&#xff09;——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 删除 头部删除 元素…

一文告诉你,如何使用Python构建一个“谷歌搜索”系统 | 内附代码

来源 | hackernoon编译 | 武明利责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;在这篇文章中&#xff0c;我将向您展示如何使用Python构建自己的答案查找系统。基本上&#xff0c;这种自动化可以从图片中找到多项选择题的答案。有一件事我们要清楚&…

WatchStor观察:思科携EMC等合作伙伴 圈地数据中心市场

早在今年3月&#xff0c;思科在加利福尼亚州圣何塞市展会中展示了“统一计算系统”(Unified Computing System)之后&#xff0c;我们就明白&#xff0c;数据中心市场将会发生巨大改变&#xff0c;传统的以IBM、惠普、戴尔和Sun为主导的服务器电脑市场&#xff0c;将受到以思科为…

使用BabeLua3.x在cocos2d-x中编辑和调试Lua

BabeLua是一款基于VS2012/2013的Lua集成开发环境&#xff0c;具有Lua语法高亮&#xff0c;语法检查&#xff0c;自动补全&#xff0c;快速搜索&#xff0c;注入宿主程序内对Lua脚本进行调试&#xff0c;设置断点观察变量值&#xff0c;查看堆栈信息等功能。 如何安装 请参考《系…

ASA与PIX的区别

很多年来&#xff0c;Cisco PIX一直都是Cisco确定的防火墙。但是在2005年5月&#xff0c;Cisco推出了一个新的产品——适应性安全产品&#xff08;ASA&#xff0c;Adaptive Security Appliance&#xff09;。不过&#xff0c;PIX还依旧可用。我已听到很多人在多次询问这两个产品…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;ubuntu g&#xff09;——插入》已给出。本文将分析各个容器中遍历和查找的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 遍历 从前往后 元素个数>15000 t…

买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划

作者 | 菜园子哇编辑 | 唐小引来源 | CSDN 博客马上上班了&#xff0c;回来的路上&#xff0c;上班地铁上都是非常急需口罩的。目前也非常难买到正品、发货快的口罩&#xff0c;许多药店都售完了。并且&#xff0c;淘宝上一些新店口罩库存写着非常多&#xff0c;但不发货&#…

GlusterFS下如何修复裂脑文件?(续一)

关于网上一些修复GlusterFS裂脑文件的说明1、Fixing a GlusterFS split-brainhttps://inuits.eu/blog/fixing-glusterfs-split-brain在该文章中&#xff0c;删除无效副本时提供的方法如下&#xff1a;srv02$ sudo find /export/brick1/sdb1/ -samefile /export/brick1/sdb1/tes…

MySQL数据库环境使用全过程

在使用MySQL之前&#xff0c;需要建立数据库的环境来创建数据表&#xff0c;首先我们需要安装该数据库环境&#xff0c;即MySQL。1、下载MySQLMySQL的官方网站是http://www.mysql.org/&#xff0c;如图2-9所示&#xff1a;图2-9 MySQL官方网站当前稳定版本为5.1&#xff0c;我…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入

操作系统是Windows10 64bit&#xff0c;编译器是 Microsoft Virtual Studio Community 10。编译产出是64位测试程序。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 因为加入测量&#xff0c;就会导致误差。我已经尽量将环境影响降低&#xff0c;但是还是难免…

“夸夸机器人”App来了:变身百万粉丝大V,48万人给你的帖子点赞

来源 | mashable译者 | Kolen出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;我在Botnet上的第一条帖子获得了48万个赞。一款全新的社交媒体风格的应用为用户提供了生活在一个奇特网络虚拟世界的机会。在这个世界里&#xff0c;你将拥有数以百万计的粉丝&#xff0c;…

leetcode Reverse Linked List

Reverse a singly linked list 对于这种可以修改值的&#xff0c;把值逆序就可以了。。。。用vector存&#xff0c;然后逆序读。 都忘了指针怎么赋值初始化了。*p&head; 1 /**2 * Definition for singly-linked list.3 * struct ListNode {4 * int val;5 * Lis…

抗击新冠肺炎,如何进行实时动态时序图谱建模与分析?

作者 | 闭雨哲来源 | ThutmoseAI背景介绍新冠肺炎是一种具有最长达24天潜伏期的新型突发性传染疾病&#xff0c;这种特性给疫情防控带来了巨大的挑战&#xff0c;随着感染规模的不断扩增&#xff0c;简单的人为治理已不太奏效&#xff0c;使用“大数据”技术手段来辅助人为治理…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;Windows VirtualStudio&#xff09;——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 删除 …

关于服务器启动慢的问题

今天去了家医院的机房&#xff0c;走进去一看&#xff0c;TMD的医院就是有钱&#xff0c;全是光纤和千兆网络环境&#xff0c;全全是思科的三层交换机和路由器&#xff0c;HP的服务器。我们需要安装点东西&#xff0c;登录一台服务器&#xff0c;我一看配置&#xff0c;呵呵&am…

python依赖包exe文件安装问题

2019独角兽企业重金招聘Python工程师标准>>> 在使用python的exe程序安装依赖包的时候&#xff0c;经常会出现类似于下面的错误&#xff1a; python version 2.7 required,which was not found in the registry 可以使用如下代码解决该问题: # # script to register …

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;Windows VirtualStudio&#xff09;——插入》已给出。本文将分析各个容器中遍历和查找的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 遍历 从前往后 travers…

技术战“疫”,贾扬清、李飞飞要给程序员直播讲AI技术!

「时势造英雄&#xff0c;英雄亦造时势。」在这场波及全球且看不见硝烟的疫情下&#xff0c;无数英雄日夜奋战&#xff0c;无论是身处一线的医护工作者、政府职能部门、志愿者&#xff0c;还是坚守在家的人民群众&#xff0c;都在尽自己所能&#xff0c;在行动&#xff01;与此…

关于端口映射的一个命令

今天安装一个远程会诊的系统&#xff0c;由于是在不同和的地方&#xff0c;需要在路由器上作下映射&#xff0c;由于是要远程连接对方的服务器&#xff0c;所以要在对方的路由器上设置下Interface fastethernet0/0 Ip address 192.168.1.1 255.255.255.0 Duplex auto Speed aut…

elasticsearch简介

Elasticsearch是 面向文档型数据库&#xff0c;这意味着它存储的是整个对象或者 文档&#xff0c;它不但会存储它们&#xff0c;还会为他们建立索引&#xff0c;这样你就可以搜索他们了。你可以在 Elasticsearch 中索引、搜索、排序和过滤这些文档。不需要成行成列的数据。所以…

C++拾取——使用stl标准库生成等差、等比数列的方法

代码是思想的表达。阅读代码是一个猜测、求证的过程。这个过程非常费脑&#xff0c;所以人们都不喜欢啰啰嗦嗦的表达方式。于是在相同认知水平下&#xff0c;简洁高效的表达是喜闻乐见的。本文将抛砖引玉&#xff0c;通过一些案例讲解如何去简化代码。&#xff08;转载请指明出…

利用NetBIOS名称与其他计算机通信

当某台计算机与网络中的其他计算机通信时&#xff0c;它是如何依据对方的计算机名称来得知其IP地址呢&#xff1f;名称解析的方法有以下几种&#xff1a; 检查NetBIOS名称缓存&#xff08;NetBIOS name cache&#xff09;广播直接向WINS服务器查询何谓NetBIOS名称&#xff1a;如…

编程语言性能实测,Go比Python更胜一筹?

作者 | Pawel Dziubałka, Sebastian Karasiewicz译者 | 泓技出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;互联网上有非常多的精彩代码&#xff0c;它们成了构建各种基础设施的基础。你正在阅读的这个平台同样也在致力于创建出色的代码。尽管普通用户一般不会注意…

mysql备份策略的制定

需要考虑的因素&#xff1a; 1. 数据库是不是都是innoDB引擎表 -》决定备份方式&#xff0c;热备或冷备 2. 数据量大小 -》逻辑备&#xff08;量小&#xff09;或物理备&#xff0c;全量或增量 3. 数据库本地空间是否充足 -》备份到本地或远程 4. 需要多快恢复 -》备份频率 小时…

C++拾取——使用stl标准库实现排序算法及评测

今天看了一篇文章&#xff0c;讲各种语言的优势和劣势。其中一个观点&#xff1a;haskell非常适合写算法&#xff0c;因为使用者不用去关心具体的计算机实现&#xff0c;而只要关注于操作语义。这让它在专心研究算法的人中非常受欢迎。所以很多时候&#xff0c;语言的争论没有太…

几行代码构建全功能的对象检测模型,他是如何做到的?

作者 | Alan Bi 译者 | 武明利&#xff0c;责编 | Carol 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 如今&#xff0c;机器学习和计算机视觉已成为一种热潮。我们都看过关于自动驾驶汽车和面部识别的新闻&#xff0c;可能会想象建立自己的计算机视觉模型有多酷。…