首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringMVC扩展(一)

SpringMVC扩展(一)

作者头像
Java_慈祥
发布于 2024-08-06 05:15:14
发布于 2024-08-06 05:15:14
3660
举报
文章被收录于专栏:SSM专栏SSM专栏

SpringMVC扩展

REST 软件架构:

Representational State Transfer,表述性状态转移,是一种软件架构风格 查看、修改、删除所对应的传统URL与REST风格的URL对比

/userview.html?id=12 VS /user/view/12 参数不再使用“?”传递 与传统不同就是 REST 不在通过?来传递参数,这种URL的可读性更好,项目架构清晰; 最关键是SpringMVC 它支持这种风格~ 弊端:对于中国的项目,URL中有时候存储中文, 中文乱码…(中文真让人头大呀~)

现在很多网站都是 REST 和 传统的URL 结合使用;

实例代码:

代码语言:javascript
AI代码解释
复制
	@RequestMapping(value="/xxx/{参数名1}/{参数名2}")				
	public String info(@PathVariable("参数名1") Integer id,@PathVariable("参数名2") String name){
				//@PathVariable注解: 将URL中的{xx} 占位符参数 绑定到对应的控制器方法参数中;
		//打印输出
		System.out.println("===============" + id + "============" + name);		
		return "/页面名";							//这里return "/页面名";  加了一个 /表示回到项目根目录,因为受上面的@RequestMapping(value="/xx/{}/{}")影响,当然相对路径不匹配~			
	}

假设有一条URL : localhost:8080/项目名/rest/1/wsm 重点是 /rest/1/wsm 控制器是代码是:

代码语言:javascript
AI代码解释
复制
	@RequestMapping(value="/rest/{id}/{name}")				
	public String info(@PathVariable("id") Integer id,@PathVariable("name") String name){
		//控制台打印
		System.out.println("===============" + id + "============" + name);		
		return "/index";		//随便就好~
	}

控制台输出:

需要注意的就是: return “/xx”; / 使其回归根目录~ 参数多个时候, xx/{}/{} 要对应,不然可能找不到控制器; 而且因为很多时候, 受REST影响返回页面的静态资源也可能存在路径异常: 通常建议使用绝对路径来解决此问题… 在路径前加 ${pageContext.request.contextPath }/ 表示绝对路径; 一般用于JSP页面上对的静态资源引用防止路径引用出错… 等价于<%=request.getContextPath()%> 小脚本引用内置对象调用方法来获取 绝对路径…

{pageContext.request.contextPath }/ 也就是取出部署的应用程序名或者是当前的项目名称 {pageContext.request.contextPath}或<%=request.getContextPath()%> 取出来的就是: /项目名 。 而"/"代表的含义就是 http://localhost:8080 比如我的项目名称是demo1在浏览器中输入为:http://localhost:8080/Demo/index.jsp。 取出来的就是: /Demo

使用Servlet API对象作为处理方法的入参

在SpringMVC中 控制器可以不依赖任何Servlet APl对象( 直接把类型作为,参数放在方法中 既可以使用) 可以将Servlet APl 对象作为处理方法的参数 进行使用; controller(控制器方法Demo)

代码语言:javascript
AI代码解释
复制
	@RequestMapping("/请求页面名")
	public String Demo(HttpSession session,HttpServletRequest request){
	
		session.setAttribute("session","session作用域");		//往session 作用域存储数据;
		request.setAttribute("request","request作用域");		//往request 作用域存储数据;
		
		return "响应页面";
	}

静态资源文件的引用:

SpringMVC 在引用外部的静态资源有时候存在失效情况… 因为: web.xml 中配置的 DispatcherServlet (分配器) 请求映射为 / 即: SpringMVC 将捕获的web 容器的所有请求; (包括静态的请求,而SpringMVC将它们当成了一个普通的请求, 但由于找不到对于的处理器,所有按照常规的方式引入: 静态文件"无法访问" …)

采用 <mvc:resources > 解决静态资源访问问题: 首先为了方便管理,一般将项目中的所有静态文件资源:(JS,HTML,CSS…) 放在一个目录下

JSP文件:

代码语言:javascript
AI代码解释
复制
<link rel="stylesheet" type="text/css" href="static/css/index.css">
<!-- 不详细介绍了就是一个 引用外部资源的代码... -->

Spring核心配置文件

代码语言:javascript
AI代码解释
复制
	<!-- 访问静态资源 css js html..  打开访问权限,SpringMVC 默认不允许静态资源的加载的;  -->
	<mvc:resources location="/static/" mapping="/static/**" />
<!--
	location 	将静态资源映射到指定的路径下; 文件请求经过 DispatcherServlet 判断文件的在 static 目录下进行特殊处理.. 
	mapping		本地静态资源文件的目录; ** 文件下的所有文件;
-->

解决项目中的中文乱码问题:

web.xml

代码语言:javascript
AI代码解释
复制
	 <!-- 解决项目中的控制器 中文参数乱码问题 -->
	<filter>   									<!-- 过滤器 -->
   	<filter-name>myencoding</filter-name> 		<!-- 过滤器name -->
   												<!-- 引入过滤器 类 -->
   	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
   	<init-param>
   		<param-name>encoding</param-name> 		<!-- 指定编码形式 -->
   		<param-value>UTF-8</param-value>  		<!-- UTF-8编码 -->
   	</init-param>
   </filter>
   
   <filter-mapping>     						<!-- 过滤器映射  -->
   	<filter-name>myencoding</filter-name>    	<!-- 根据过滤器名,映射指定的过滤器.. -->
   	<url-pattern>/*</url-pattern>  				<!-- /* 对所有文件(包括JSP)进行过滤配置,设置文件编码UTF-8 -->
   </filter-mapping>

异常处理:

局部异常处理 方式一:控制器类继承 HandlerExceptionResolver

代码语言:javascript
AI代码解释
复制
@Override  									//控制器类继承了 HandlerExceptionResolver 重写resolveException(..); 方法;
	public ModelAndView resolveException(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3) {
		//当发生异常时,SpringMVC 会调用resolveException(..); 方法并返回一个 ModelAndView 给浏览器;
		return new ModelAndView("err");  		//指定异常之后跳转的页面;
	}

方式二:使用注解 @ExceptionHandler

代码语言:javascript
AI代码解释
复制
	@RequestMapping(value="/index")						//控制器接收的 index 
	public ModelAndView index(){
		ModelAndView mas = new ModelAndView();   		//注意导包错误!
		mas.setViewName("index");						//要响应的 视图页面;
		System.out.println(1/0);						//手动抛出一个运行时异常...运行时异常
		return mas; 
	}	
	
	@ExceptionHandler(value={RuntimeException.class})  						//注解声明运行时异常,当类中有运行时异常会进入该方法处理;
	public String err(RuntimeException e,HttpServletRequest request){		//参数异常对象,可以通过request..返回给异常页面查看
		request.setAttribute("e",e);
		return "err";														//处理异常方法,返回异常页面 err ;
	}
代码语言:javascript
AI代码解释
复制
 对于这些异常参数,可以存储在 request/session/Model 中返回异常页面.通过   ${参数名.message }  来查看  异常信息;   

全局异常处理

上面的局部异常, 一次只有作用于一个 controller控制器有效, 局部异常 如果需要对所有异常进行匹配就需要全局异常处理了

全局异常可以使用:SimpleMappingExceptionResolver

代码语言:javascript
AI代码解释
复制
	<!-- 全局的异常配置信息 -->
	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="defaultErrorView" value="err" />
	</bean>

可以在props中定义多种类型异常

代码语言:javascript
AI代码解释
复制
<!-- 可以在props中定义多种类型异常 -->
	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.RuntimeException">err</prop> 
				<prop key="异常">异常类名映射的视图名</prop> 
			</props>
		</property>
	</bean>

格式化注解@DateTimeFormat

有时候SpringMVC 新增时候报错, BindException,是在对bean的属性进行数据绑定时出了问题。 这是springmvc框架的问题,若不解决次问题 页面传递回来的时间类型的数据就无法在controller中接受(实体类Date 页面传过是 String ) 也就无法完成新增用户的功能。 通常都是时间类型绑定失败; 解决方法有很多:使用@DateTimeFormat 引入:joda-time-2.9.9.jar 包 在实体类上引入注解:

代码语言:javascript
AI代码解释
复制
public class 实体类 {	
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date birthday;
}

在上述代码中,@DateTimeFormat(pattern="yyyy-MM-dd")可以将形如1988-12-01的字符串转换为java.util.Date类型。 算是一种解决方法;

注意:这个只是在中文赋值时候转换成 Date 类型的对象,如果想要查看 还是以英文的时间格式, 不过~ 这个在Spring 的表单中可以搭配使用, 显示对应的格式~

总结:

  • @DateTimeFormat 声明在实体属性上,前端发送的 字符串类型日期格式, 可以直接和对象进行绑定匹配!
  • 只是解决前端String——后端Date绑定,后端Date——前端展示还需另外处理!

Spring表单

现在前后端已经区分很明确了,JSP已经很少使用了,Spring表单也很少使用了! 我们在进行SpringMVC 项目开发时,一般会使用 EL表达式 和 JSTL标签 HTML表单… 来完成页面视图开发. Spring也有自己的一套标签库,通过Spring表单标签; 可以更容易的将模型数据表单, 命令对象绑定到 HTML 表单元素中; 首先和JSTL标签库一样,在使用Spring表单之前。必须在JSP页面下添加:引入标签库 <%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %> 之后就可以使用Spring的表单标签库了…

实例代码有点不好解释, 就直接上项目Demo了

做一个模拟用户查看功能: SpringMVC 的配置就不锁了,web.xml ..applicationContext-mvc.xml

首先实体类user

代码语言:javascript
AI代码解释
复制
public class User {
	private Integer id;
	
	private String name;
	
	private String pwd;
	
	@DateTimeFormat(pattern="yyyy-MM-dd")		//使用了注解时间参数赋值问题,注意引用jar哦~
	private Date birthday;
	
	private Integer sex;

	//get/set 方法...;
}

控制器UserController.java

代码语言:javascript
AI代码解释
复制
package com.wsm.controller;

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

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wsm.entity.User;

@Controller
public class UserController {

	//因为这里我们没有数据库就模拟一些数据出来~
	//静态用户集合,类加载时候创建;
	private static  List<User> users  = new ArrayList<User>();
	//静态代码块,初始化一下用户出来;
	static{
		User u1 = new User();
		u1.setId(1);
		u1.setName("wsm");
		u1.setBirthday(new Date());
		u1.setPwd("123");
		u1.setSex(1);
		
		User u2 = new User();
		u1.setId(2);
		u2.setName("wsx");
		u2.setBirthday(new Date());
		u2.setPwd("321");
		u2.setSex(0);
		
		//把 u1 u2 放在users 集合中
		users.add(u1);
		users.add(u1);
	}
	
	//展示数据 index页面
	@RequestMapping("/index")
	public String index(Model model){
		
		model.addAttribute("user", users);
		
		return "index";
	}
	
	//去修改页面 
	@RequestMapping("/toupd")
	public String toupd(Integer id,Model model){
		
		User u = users.get(id-1);		//下标获取, 要注意数据下标 0 开始; 所以减一
		model.addAttribute("user",u);
		return "upd";
	}
	
}

index.jsp

代码语言:javascript
AI代码解释
复制
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
   	<c:if test="${user==null }">
   		<script type="text/javascript">
   			location.href="index";
   		</script>
   	</c:if>
  <a href="toadd" >新增</a>     	
  	<table border="1" width="100%">
  		<tr>
  			<td>编号</td>
  			<td>用户名</td>
  			<td>密码</td>
  			<td>性别</td>
  			<td>生日</td>
  			<td>操作</td>
  		</tr>
  		<c:forEach items="${user }" var="u" >
  			<tr>
  				<td>${u.id }</td>
  				<td>${u.name }</td>
  				<td>${u.pwd }</td>
  				<td>${u.sex }</td>
  				<td>${u.birthday }</td>  <!-- 这时页面上的时间还是英文格式, 哎看着就不舒服-->
  				<td>  <a href="toupd?id=${u.id }" >修改</a>  </td>
  			</tr>
  		 </c:forEach>
  	</table>
   	
  </body>
</html>

点击修改擦看详情信息~ 这里不实现修改了… upd.jsp

代码语言:javascript
AI代码解释
复制
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %> <!-- 引入Spring表单库 -->
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'upd.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  
  	<!-- 相当于HTML 的 form: 
  		action/method不介绍了:	action,如果不指定提交默认为提交到获取表单页面的URL	 (即上一个地址!)
  		
  		modelAttribute:	用于表示绑定的 模型属性; 就是 Model 中存储的要修改对象; (不存在会报错)
  			如果不指定属性名,默认取名是 command (一般都手动取名)
  			而且可以同时对应 新增和修改;
  			新增在去新增的控制器model 这存储一个空的对象即可, 提交时候会把表单的数据存在这个属性中: 发送至控制器;
  			也就是说, 需要由控制器Modle给  modelAttribute 提供一个属性,
  			modelAttribute 提交时也把表单的数据 返回值控制器;...
  	 -->
   	<fm:form action="upd" method="post" modelAttribute="user" >
   		<table>
   			<tr>
   				<td>名称</td>
   				<td>
   					<fm:input path="name"/>  
   					  <!--  path:属性路径,表示表单的对象属性;  
   					  	 	如果model中存在 modelAttribute="对象属性" 且 path="又对应对象的属性" 则展示表单;
   					  	 	model中不存在     modelAttribute="属性名"		自动以属性名为名,提交时候把表单的值都放进入,发送至控制器;
   					  -->
   				</td>
   			</tr>
   			<tr>
   				<td>密码</td>
   				<td>
   					<fm:input path="pwd"/>
   				</td>
   			</tr>
   			<tr>
   				<td>性别</td>
   				<td>
   					<fm:radiobutton path="sex" value="1"/><fm:radiobutton path="sex" value="0"/></td>
   			</tr>
   			<tr>
   				<td>生日</td>
   				<td>
   					<fm:input path="birthday"/>			<!-- 注意看这里,Spring表单对 Date 不在是英文格式时间,而是跟随@DateTimeFormat一样了 -->
   				</td>
   			</tr>
   		</table>
   		<!-- 
   			<input type="submit" value="提交"> 
   			提交,就不提交了,不做修改了. 主要是想看看; SpringMVC的表单一些功能...;
   		--> 
   	</fm:form>
   	
  </body>
</html>

ok ,就是这样了~ 部署运行即可~ Spring常用表单标签

名称

说明

< fm:form />

输入框组件标签

< fm:password />

密码框组件标签

< fm:hidden />

隐藏框组件标签

< fm:textarea />

多行输入框组件标签

< fm:radiobutton />

单选框组件标签

< fm:checkbox />

复选框组件标签

< fm:select />

下拉列表组件标签

< fm:error />

显示表单数据校验所对应的错误信息 (通常可以搭配 JSR303约束使用)

标签属性

属性

描述

path

属性路径,表示表单对象属性。

cssClass

表单组件对应的CSS样式类名

cssErrorClass

当提交表单后报错(服务端错误),采用的CSS样式类

cssStyle

表单组件对应的CSS样式

htmlEscape

绑定的表单属性值是否要对HTML特殊字符进行转换,默认为true

注意: 表单组件标签也拥有HTML标签的各种属性,比如:id、onclick等等,都可以根据需要,灵活使用;


数据校验:JSR303

目前为止对于数据的验证;一般都是在前端 进行JS 表单验证; 而 一直没有加入 "服务器端的数据验证"

SpringMVC中有两种方式可以进行 数据验证:

  • 利用Spring自带的验证框架 fm
  • 利用JSR 303 实现; (一般都搭配 Spring框架一起使用) , 也可以和表单框架搭配使用!

JSR 303:Java为Bean数据合法性校验所提供的标准框架

  • Spring MVC支持JSR 303标准的校验框架
  • JSR 303通过在Bean属性上标注校验注解指定校验规则,并通过标准的验证接口对Bean进行验证; 可以通过 http://jcp.org/en/jsr/detail?id=303 下载 JSR303 Bean Validation

注意: Spring本身没有提供JSR303的实现 实现者:Hibernate Validator , 所以必须加入 Hibernate Validator 库的 jar; hibernate-validator-4.3.2.Final.jar jboss-logging-3.1.0.CR2.jar validation-api-1.0.0.GA.jar 导入这三个Jar Srping就会自动加载…

JSR 303 约束

约束

说明

@Null

被注释的元素必须为null

@NotNull

被注释的元素必须不为null

@AssertTrue

被注释的元素必须为 true

@AssertFalse

被注释的元素必须为 false

@Min(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max, min)

被注释的元素的大小必须在指定的范围内

@Digits (integer, fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past

被注释的元素必须是一个过去的日期

@Future

被注释的元素必须是一个将来的日期

继续刚才的Demo 加一个新增 表单验证; 修改实体类; User.java

代码语言:javascript
AI代码解释
复制
package com.wsm.entity;
import java.util.Date;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;

public class User {
	private Integer id;
	
	@NotEmpty(message = "不能为空!") 		
	@NotNull(message = "不能为Null!")
	private String name;
	
	@Length(min = 6, max = 20,message="密码的长度必须6-20之间")
	private String pwd;
	
	@DateTimeFormat(pattern="yyyy-MM-dd")		//使用了注解时间参数赋值问题,注意引用jar哦~
	@Past(message="年龄必须是过去时")
	private Date birthday;
	
	private Integer sex;

	//get/set 方法...;
}

控制器:加两个方法:

代码语言:javascript
AI代码解释
复制
	//新增控制器
	//去新增
	@RequestMapping("/toadd")
	public String toadd(Model model){
		User u = new User();
		model.addAttribute("userForm",u);		//因为表单中需要一个 modelAttribute="userForm" 所以存一个空的给它咯~
		return "add";
	}
	
	//新增
	@RequestMapping("/add")
	public String add(@ModelAttribute("userForm") @Valid User user,BindingResult bindingResult){ 	
					//两个参数注解  @ModelAttribute() @Valid
					// @ModelAttribute(): 将表单modelAttribute="userForm" 赋值给 user;
					// @Valid			  	<mvc:annotation-driven /> 默认装配一个 LocalValidatorFactoryBean,通过注解使SpringMVC 在数据绑定使进行 校验;
					// @Valid注解标示的参数后面,必须紧挨着一个BindingResult参数,否则Spring会在校验不通过时直接抛出异常

		//参数 bindingResult 是必须的,或是Error类型. 用来判断是否发送异常~ : 表单输入与实体类注解不符合;
		if(bindingResult.hasErrors()){ 
			return "add";	//有误跳转回新增页面; 由 <fm:errors path="xx" /> 展示对应的异常信息;
		}
		//新增就是往集合中在放一个;
		users.add(user);
		return "index";		//新增成功index 展示;
	}

add.jsp

代码语言:javascript
AI代码解释
复制
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %> <!-- 引入Spring表单 -->
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'add.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  <body>
   
   
    <fm:form action="add" method="post" modelAttribute="userForm">
  	<table>
  			
  			<tr>
  				<td>编号</td>
  				<td>
  					<fm:input path="id"/>
  					<fm:errors path="id"></fm:errors>
  				</td>
  			</tr>
  			<tr>
  				<td>名称</td>
  				<td>
  					<fm:input path="name"/>
  					<fm:errors path="name"></fm:errors>
  				</td>
  			</tr>
  			<tr>
  				<td>密码</td>
  				<td>
  				<fm:input path="pwd"/>
  				<fm:errors path="pwd"></fm:errors>
  				</td>
  			</tr>
  			<tr>
  				<td>生日</td>
  				<td>
  				<fm:input path="birthday"/>
  				<fm:errors path="birthday"></fm:errors>
  				
  				</td>
  			</tr>
  			<tr>
  				<td>性别</td>
  				<td>
  					<fm:radiobutton path="sex" value="1"/><fm:radiobutton path="sex" value="0"/></td>
  			</tr>
  		</table>
  		<input type="submit" value="提交">
  </fm:form>
  </body>
</html>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Podman 保姆级使用教程,太顶了!
cockpit-podman 软件包作为 cockpit 插件可集成于 Web UI 中,实现 Web UI 管理容器。
米开朗基杨
2022/04/09
23.5K1
Podman 保姆级使用教程,太顶了!
【Podman】podman入门学习 | Docker替代品
在上手程度上:Podman 的操作方式与 Docker 高度兼容,很适合docker用户转型使用podman。使用命令几乎和docker相同
宝耶需努力
2022/12/13
4.5K0
【Podman】podman入门学习 | Docker替代品
Docker 大势已去,Podman 即将崛起
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
1.1K0
Podman 从入门到精通
在本文中,我们将了解 Podman(Pod Manager的缩写)、它的功能和用法。
我的小碗汤
2023/03/19
3K0
Podman 从入门到精通
是时候跟Docker说再见了
在容器的远古时代(差不多就是 4 年前),Docker 是这场游戏的唯一玩家。但现在情况已经不一样了,Docker 不再是唯一玩家,而只是一个容器引擎而已。我们可以用 Docker 构建、运行、拉取、推送或检查容器镜像,但对于这里的每一项任务,都有其他可替代的工具,它们可能比 Docker 做得更好。所以,让我们来探究一下它们,然后卸载和忘掉 Docker……
TASKCTL 任务调度平台
2021/01/13
1.3K0
是时候跟Docker说再见了
容器引擎Docker与Podman解析
最近技术群里有朋友问我,不是说K8S要弃用Docker了吗?还要不要继续学习这块内容?是不是得改行卖白菜了?
Luga Lee
2021/12/09
1.3K0
容器引擎Docker与Podman解析
放弃手中Docker拥抱下一代容器管理工具Podman
官网描述: Podman是一个无守护进程的容器引擎,用于在Linux系统上开发、管理和运行OCI容器(开源的容器管理工具)。容器可以作为根运行,也可以以无根模式运行。简单地说:alias docker=podman简单的说它是下一代容器。
全栈工程师修炼指南
2020/10/09
3K0
放弃手中Docker拥抱下一代容器管理工具Podman
podman初试-和docker对比
Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。容器是完全使用沙箱机制,相互之间不会有任何接口。
张琳兮
2019/11/07
7.4K0
macOS 终于可以完美使用 Podman 了!
Podman 是一个无守护程序与 Docker 命令兼容的下一代 Linux 容器工具,该项目由 RedHat 主导,其他的细节可以参考 Podman 使用指南[1],本文的重点不是这个。
Jintao Zhang
2021/05/11
8.6K0
macOS 终于可以完美使用 Podman 了!
从Podman到Kubernetes:实用集成指南
了解如何将 Podman 与 Kubernetes 集成以增强容器管理并提高部署效率
云云众生s
2024/03/29
2.4K0
从Podman到Kubernetes:实用集成指南
podman快速入门详解与实践
Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon。以前使用 Docker CLI 的时候,Docker CLI 会通过 gRPC API 去跟 Docker Engine 说「我要启动一个容器」,然后 Docker Engine 才会通过 OCI Container runtime(默认是 runc)来启动一个容器。这就意味着容器的进程不可能是 Docker CLI 的子进程,而是 Docker Engine 的子进程。
互联网-小阿宇
2022/11/21
1.5K0
Podman 会取代 Docker 吗?
Linux容器 是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由另一个镜像提供,这意味着从开发到测试再到生产的整个过程中,Linux 容器都具有可移植性和一致性。因而,相对于依赖重复传统测试环境的开发渠道,容器的运行速度要快得多。容器比较普遍也易于使用,因此也成了 IT 安全方面的重要组成部分。[1]
YP小站
2020/06/04
13.7K1
一步步学KubeVirt CI (2) - 镜像构建
scratch是一个空镜像,直接docker hub下载是下不了的,只能在Dockerfile中用FROM
后端云
2022/11/25
6890
一步步学KubeVirt CI (4) - Podman
podman和docker cli命令几乎完全一致,常用命令基本感觉不到区别。Podman CLI 里面87%的指令都和Docker CLI 相同。
后端云
2022/11/25
1.1K0
一步步学KubeVirt CI (4) - Podman
无需 Daemon 进程的容器工具:Podman
Linux 容器是由 Linux Kernel 提供的具有特定隔离的进程。Linux 容器技术能够让用户对应用及其整个运行时环境(包括全部所需文件)一起进行打包或隔离。从而让用户在不同环境,之间轻松迁移应用的同时,并保留应用的全部功能。
CS实验室
2021/03/22
1.9K0
无需 Daemon 进程的容器工具:Podman
Docker-Docker
在 云原生项目的 CI 中, 需要创建一个沙盒环境去创建和销毁CI环境用来 测试虚拟机环境或容器环境。几年前还是用 vagrant + libvirt + kvm,现在随着容器技术的发展,vagrant 虚拟机化的CI环境 已经基本不用了。取而代之的是容器化的CI环境。
后端云
2022/11/25
1.3K0
Docker-Docker
packer基本使用
Packer是一个从单一的模板文件来创建多平台一致性镜像的轻量级开源工具,它能够运行在常用的主流操作系统如Windows、Linux和Mac os上,能够高效的并行创建多平台例如AWS、Azure和Alicloud的镜像,它的目的并不是取代Puppet/Chef等配置管理工具,实际上,当制作镜像的时候,Packer可以使用Chef或者Puppet等工具来安装镜像所需要的软件。通过Packer自动化的创建各种平台的镜像是非常容易的。
后端云
2022/11/25
1.3K0
packer基本使用
基于 Kubernetes 的 Jenkins 服务也可以去 Docker 了
在之前的文档 《在 Kubernetes 上动态创建 Jenkins Slave》 中, 我描述了通过挂载 /var/run/docker.sock 文件, 允许在 Docker 驱动的 Kubernetes 集群中构建和推送镜像。在文档 《如何在 Docker 中使用 Docker》中, 我又进行了更加详细地阐述, 其原理是共享主机 Docker Daemon。
陈少文
2021/02/26
1.7K0
基于 Kubernetes 的 Jenkins 服务也可以去 Docker 了
Docker不再是唯一的选择
在容器的早期时代(其实更像是4年前),Docker是容器游戏中唯一的玩家。但现在情况已经不一样了,Docker不再是唯一的一个,而只是其中一个容器引擎而已。Docker允许我们构建、运行、拉、推或检查容器镜像,然而对于每一项任务,都有其他的替代工具,甚至可能比Docker做得还要好。所以,让我们探索一下,然后再卸载(只是可能),直至完全忘记Docker……
用户6543014
2020/12/08
1.2K0
Docker不再是唯一的选择
如何使用Skopeo做一个优雅的镜像搬运工
[TOC] 0x00 基础介绍 描述: 作为公司内部 PaaS toB 产品的打包发布人员,容器镜像对我们打工人而言就像是工地上的砖头 🧱,而我的一部分工作就是将这些砖头在各个仓库之间搬来搬去,最终
全栈工程师修炼指南
2022/09/29
5.4K0
如何使用Skopeo做一个优雅的镜像搬运工
相关推荐
Podman 保姆级使用教程,太顶了!
更多 >
LV.6
这个人很懒,什么都没有留下~
目录
  • SpringMVC扩展
    • REST 软件架构:
    • 使用Servlet API对象作为处理方法的入参
    • 静态资源文件的引用:
    • 解决项目中的中文乱码问题:
    • 异常处理:
    • 格式化注解@DateTimeFormat
    • Spring表单
      • 实例代码有点不好解释, 就直接上项目Demo了
    • 数据校验:JSR303
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档