SpringMVC 1.2

C#实战大华智能安防系统:从SDK封装到视频流与智能报警的全链路落地 本文将介绍C#集成大华SDK开发安防系统的实战经验,重点解决多路视频预览卡顿和报警延迟问题。文章通过三层架构设计(SDK封装层、业务服务层、应用层)实现解耦,详细分析线程安全封装、高效解码显示和智能事件联动等核心技术。针对16路摄像头同时预览时CPU占用率过高的问题,提出使用子码流拉流与异步解码的优化方案,并总结8个常见开发陷阱的解决方案。文中还提供了大华智能安防系统的完整架构图,展示从设备层到应用层的交互流程,特别强调业务服务层中视频流服务和智能报警服务的核心功能设计。 阅读详情

1、请求URL和方法的映射

@RequestMapping注解来进行URL和方法的映射

可能的情况:

①一个类里面,每个方法的URL,没有相同的部分,于是每个方法上面,都各自指定一个URL。

②一个类里面,所有的方法,前面部分都是一样的,比如:

/user/add、/user/list、/user/view、/user/update

此时可以在类上面使用 @RequestMapping(value=”/user”),此时方法上面就只需要:@RequestMapping(value=”add”)。

HTTP的请求方法:

GET  


POST  


DELETE 删除服务器的数据


PUT     新增数据


HEAD    只返回响应头

浏览器只能发送GET、POST请求,其他的请求浏览器无法直接发送。可以借助一些手段发送GET、POST之外的其他请求。

2、视图解析器

作用:简化返回的视图路径。在SpringMVC里面,支持多种视图,如JSP、xml

举个较常用的视图解析器,更多可查看Spring官方文档

①hello-servlet.xml

注意:如果使用UrlBasedViewResolver,需要加上jstl的jar包,否则抛出java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config


在输入访问路径后,配置以上内容后会自动加上前缀/WEB-INF/content/,后缀.jsp

②控制器

web项目结构:


测试:



3、接收浏览器的参数

index1.jsp


①在SpringMVC里面接收请求参数,通过方法的参数传入的

i.参数和jsp页面传过来的一致


ii.参数和jsp页面传过来的不一致。需要加上@RequestParam注解。推荐无论是否相同都加上。


测试:


4、请求参数自动转换为Java对象

平时情况:

①Employee.java


②index2.jsp

③EmployeeController.java

    @InitBinder注解的作用:任意的方法,如果使用了这个注解,就可以得到WebDataBinder对象,用于注册自定义转换器、验证器等。这个注解的方法在进行参数绑定之前执行一次。

PropertyEditor是属性编辑器的接口,它规定了将外部设置值转换为内部JavaBean属性值的转换接口方法

特殊情况:

情况1:如果出现两个相同类型不同格式的对象

①Employee.java出现两个Date,但格式不同

public class Employee {

	private String name;
	// 默认SpringMVC基本上无法把String转换为Date,需要自定义转换器
	private Date birthday;
	private int age;
	private Date updateTime;

	//getter、setter

	@Override
	public String toString() {
		return "Employee [name=" + name + ", birthday=" + birthday + ", age=" + age + ", updateTime=" + updateTime
				+ "]";
	}
}
②EmployeeController.java

此处注意,必须要有一个指定字段,否则会有一个出错

@Controller
@RequestMapping("/employee")
public class EmployeeController {

	@InitBinder
	public void initBinder(WebDataBinder binder){
		binder.registerCustomEditor(Date.class, new PropertyEditorSupport(){
			// 把字符串转换为目标数据类型的对象
			// 转换以后,需要调用父类里面的setValue方法设置Java对象。
			@Override
			public void setAsText(String text) throws IllegalArgumentException {
				DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
				try {
					Date d = format.parse(text);
					super.setValue(d);
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		
		// 指定某个字段专用的转换器
		binder.registerCustomEditor(Date.class, "updateTime", new PropertyEditorSupport(){
			
			@Override
			public void setAsText(String text) throws IllegalArgumentException {
				DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				try {
					Date d = format.parse(text);
					super.setValue(d);
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}
	
	@RequestMapping
	public String save(Employee e){
		System.out.println(e);
		return "/save.jsp";
	}

}
③测试:

情况2:请求参数包含多个对象的时候

①index3.jsp

②Department.java

③DepartmentController.java

要通过 @InitBinder 指定对象的前缀

@Controller
@RequestMapping("/department")
public class DepartmentController {
	
	//要通过 @InitBinder 指定对象的前缀
	@InitBinder("employee")
	public void employee(WebDataBinder binder){
		binder.setFieldDefaultPrefix("employee.");
	}
	@InitBinder("dept")
	public void dept(WebDataBinder binder){
		binder.setFieldDefaultPrefix("department.");
	}
	
	@RequestMapping
	public String  save(@ModelAttribute("employee") Employee employee,@ModelAttribute("dept") Department department){
		System.out.println("------"+employee);
		System.out.println("------"+department);
		return "department/save";
	}
} 

④测试:



总结:

a.如果请求参数里面,只有一个对象的数据,只需要把对象的类型作为方法的参数即可,不需要任何的额外注解。

b.有一些参数不能正常转换为对象需要的数据,则要用 @InitBinder 注册自定义的转换器。

c.如果请求参数里面包含多个对象的数据,这些数据需要有【前缀】,并且每个对象,都要有一个对应的 @InitBinder 注解的方法。同时Action方法的参数需要使用@ModelAttribute 注解对应@InitBinder 的名字。

5、请求响应方式(导航)

①forward

直接返回一个jsp的路径,就会forward到jsp。可以结合ViewResolver来找到对应的JSP文件。

②redirect

i.使用 redirect: 开头。重定向到根目录下的a.jsp文件

ii.使用RedirectView。重定向到根目录下的a.jsp文件


③响应体

i.使用@ResponseBody注解方法,直接把方法的返回值作为内容返回给浏览器

测试:


ii.使用ResponseEntity对象返回,可以自定义返回的响应头、响应内容

测试:


6、

 ①获取请求头

 使用方法的参数来进行获取,获取的时候,在参数前面使用 @RequestHeader 注解


 ②.获取Cookie值


 ③.操作Session

 每个Controller只负责管理自己的session里面的值。Session是整个用户会话共享的,在Controller里面如果要把数据放入session里面,需要先在类上面使用 @SessionAttributes注解标明哪些对象要放入session里面,当方法执行完成以后,Spring调用session.setAttribute方法放入session。

 在Controller里面,通过Model、ModelAndView对象,把数据放到【模型】里面,在方法执行完成以后,检查【模型】里面的对象的名字,是否在@SessionAttributes注解里面,如果在则放入session。

i.通过Model传值给session

下面例子中key1,key2是没存进session的,因为@SessionAttributes注解没有表明

@Controller
@RequestMapping("/session")
@SessionAttributes({"key3","key4"})
public class TestSessionAction {
	
	// 通过Model传值给session
	@RequestMapping("/1")
	public String test1(Model model){	
		model.addAttribute("key1", "val1");
		model.addAttribute("key2", "val2");
		return "session";
	}
}

ii.通过ModelAndView传值给session

	@RequestMapping("/2")
	public ModelAndView test2(){	
		ModelAndView mv = new ModelAndView();
		mv.addObject("key3", "val3");
		mv.addObject("key4", "val4");
		mv.setViewName("session");
		return mv;
	}

iii.删除当前Controller存入session的对象

	@RequestMapping("/3")
	public String test3(SessionStatus status){	
    //Mark the current handler's session processing as complete,
    //allowing for cleanup of session attributes.	
		status.setComplete();
		return "session";
	}

7、Servlet API的使用

在任何的MVC框架里面,都不推荐直接使用ServletAPI,但是几乎所有的框架,都提供了使用Servlet API的方式。

Spring提供了两种使用Servlet API的方式

①在方法参数里面,直接使用 HttpServletRequest、HttpServletResponse等作为参数,Spring MVC会自动把对象传入进来。

	@RequestMapping("/1")
	public String test(HttpServletRequest req,HttpServletResponse resp){		
		req.setAttribute("key1", "val1");
       req.getSession().setAttribute("key1", "val1");
     System.out.println("--test1--");
		return "test";
	}

@RequestMapping("/3")
	public String test3(HttpSession session){
		String p = (String)session.getAttribute("key1");
		System.out.println("test3:"+p);
		return "test";
	}

②使用WebRequest、HttpSession的对象。Spring MVC为了避免直接使用Servlet API造成的不良影响、又能够提供完全的Servlet API调用的控制,所以封装了一个叫做WebRequest的对象,通过这个对象几乎能够完成所有的Servlet API的工作。

@RequestMapping("/2")
	public String test2(WebRequest weq){
		String p = weq.getParameter("key1");
		System.out.println(p);
		//通过WebRequest将属性放入,不能使用SessionStatus.setComplete()这种方法删除
		//只能使用WebRequest的removeAttribute
		weq.setAttribute("key2", "", WebRequest.SCOPE_REQUEST);
		// 从request里面删除对象
		weq.removeAttribute("key2", WebRequest.SCOPE_REQUEST);
		// session
		weq.setAttribute("yyy", "", WebRequest.SCOPE_SESSION);
		return "test";
	}

8、拦截器

拦截器配置在【-servlet.xml】文件里面,仅在当前模块里面有效。

所有的拦截器,都需要实现org.springframework.web.servlet.HandlerInterceptor,或者继承

org.springframework.web.servlet.handler.HandlerInterceptorAdapter

①hello-servlet.xml

<mvc:interceptors>
    <!-- hello模块全局拦截器 -->
    <bean class="cony.action.TestInterceptor" />
    <mvc:interceptor>
   <!--设置拦截路径 -->
  <mvc:mapping path="/a/2"/>
        <!-- 局部拦截器 -->
        <bean class="cony.action.TestInterceptor2"/>
    </mvc:interceptor>
</mvc:interceptors>
②TestInterceptor.java

public class TestInterceptor extends HandlerInterceptorAdapter {

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion");
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle");
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("preHandle");
		// 返回true,后面的业务才会继续
		return true;
	}

}

③TestInterceptor2.java

public class TestInterceptor2  extends HandlerInterceptorAdapter{
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion2");
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle2");
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("preHandle2");
		// 返回true,后面的业务才会继续
		return true;
	}
}
④测试:

  i.

ii.可以看到局部拦截器先执行,然后才是全局拦截器

⑤拦截器方法说明

preHandle:每次进入拦截器,最先执行的方法。

如果这个方法返回false,不会继续执行后面的业务

postHandle:在进入方法、实际的业务方法执行完成以后,执行forward之前。

afterCompletion:整个请求完成的时候执行,完成forward之后执行

执行这个方法的时候,连jsp也已经执行完成。


大中型超市收银系统(可直接运行) 光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开 立即下载

相关推荐

RK3588平台-ES8388音频驱动调试与设备树配置实战

本文详细解析了在RK3588平台上调试ES8388音频驱动的实战过程。内容涵盖Linux音频驱动的三层架构(Machine、Platform、Codec),并重点提供了设备树(DTS)的完整配置示例,包括I2C节点、声卡节点及音频路由设置。文章还分享了驱动加载验证、amixer调试命令以及常见问题(如无声、变调)的排查思路,旨在帮助开发者快速完成RK3588与ES8388的音频系统集成。

mango的博客 806

SpringMVC是如何让Controler替代Servlet工作的

在学到JavaEE的部分的时候,知道了我们自己写Servlet,然后来处理一个请求的get方法或者是post方法;但是在工作后,直接使用了SpringMVC的框架;工作的时候不再需要自己写Servlet,而是写一个Controler,然后将各种请求写成方法来处理即可; 两种工作方式的差异,让我觉得自己的知识出现了断层;即,Spring框架是如何操作,让Controler来替代Servle

zhupengqq的博客 1万+

Silly Tavern(酒馆)AI 角色扮演下载与安装教程(Windows本地部署)

SillyTavern是一款开源AI角色扮演前端工具,支持沉浸式对话和长期角色互动。本文详细介绍了在Windows系统F盘部署SillyTavern的完整流程,包括下载项目、安装Node.js和Git环境、配置路径、启动服务等关键步骤,并特别说明非系统盘路径可能遇到的npm安装问题及解决方法。成功启动后,用户可通过浏览器访问本地地址使用该工具进行AI角色扮演互动。

Tan3851的博客 1万+

1. 讲下SpringMvc和Struts1,Struts2的比较的优势

性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差不多,比Struts1要高

yqhp_w 907

CODESYS Softmotion(一)功能介绍

一、CODESYS SoftMotion RTE SL产品 1.1 CODESYS Runtime SL 产品家族介绍 目前支持的主流厂商的硬件产品,让部署在上面的成为实时设备。 对于Windows系统,根据需求选择对应的Runtime: RTE极大的提高了实时性,适合进行运动控制,同时RTE还支持了多个主从站协议: 还可以选择可选的功能(Single License): RTE对硬件和系统有要求,如果你需要硬件功能,那么网卡会有最低要求。 1.2 RTE的下载和安装 在官网http://codes

Fishfishfishfishcat 2万+

永磁同步电机自抗扰控制ADRC(位置环/速度环控制器)Matlab/Simulink仿真(S-Function)

ESO是ADRC的核心,其作用是跟踪被控对象的输出,同时给出受控对象的各阶状态变量以及系统总扰动的实时估计,将其补偿到控制器中,实现动态补偿线性化。NLSEF采用非线性函数把TD产生的跟踪及微分信号与ESO给出的状态变量估计值之间的误差进行非线性组合得到初级控制量,然后同总扰动的补偿量一起生成最终的控制信号。自抗扰控制(ADRC)技术的核心思想是将简单的积分串联型视为标准模型,把系统模型中不同于标准型的部分和外部干扰之和视为总扰动,并将其扩张为一个新的状态。看作系统内外部扰动之和。令一个高阶状态变量为。

m0_66341377的博客 7614

Struts1、Struts2和SpringMVC剖析

前段框架用了不少,今天就来做个总结。网上关于Struts1、Struts2、SpringMVC的文章有很多,这里的内容就是基于它们,来做个比较。 这三个框架是按照上面的顺序,依次出现的,它们都是对MVC模式的实现。为什么会出现这三个、甚至更多的MVC框架呢?他们都是为了将URL世界映射到Java世界。尽管它们它们内部的实现思路不同,有着各自的优缺点,但是它们都做到了个自己的使用目的。

qunqin的专栏 1102

图形化界面无限转圈?CentOS 7的SELinux避坑指南(附命令行修复实录)

本文详细解析了CentOS 7图形界面启动时无限转圈或卡在'starting switch root'的故障原因,主要与SELinux安全策略冲突有关。提供了三种修复方案:临时禁用SELinux、重装策略包和精细调整策略,并分享了长期维护建议,帮助用户平衡系统安全性与可用性。

potato的博客 798

Struts2.x和1.x和SpringMVC各自的优缺点

strust1 和strust2 区别 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现...

Lin 的博客 537

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2448

基于YOLO-world训练模型的完整教程:从数据准备到微调训练

本文提供了YOLO-world模型训练的完整教程,涵盖从环境配置到微调训练的全流程。首先介绍了YOLO-world项目的安装与配置步骤,包括依赖安装和CUDA环境设置;接着详细说明了数据集的准备方法,包括COCO格式数据集的组织结构和自定义数据集的类别定义;然后阐述了配置文件的修改要点,包括超参数调整和数据集路径设置;最后讲解了训练命令的使用方法及常见问题的解决方案。本教程旨在帮助读者快速掌握YOLO-world模型的训练技能,适用于计算机视觉领域的研究人员和开发者。

FJN110的博客 1108

struts1和struts2和springMVC的区别和介绍

struts1和struts2和springMVC的区别和介绍 文章来源:http://www.cnblogs.com/nzhbk/p/6558292.html MVC是web开发常用的模式,M即模型层(Model):主要由javabean来实现。V即视图层(View):主要由jsp、velocity、freemarker等。C即控制层(Controller):主要由s

si1ence4010的博客 1464

AI Agent开发第49课-DIFY让AI自动预约排班后发企业微信通知-MongoDb-Redis-企业微信调用

我们的Dify会讲得很透彻,坚持喂饭级教程,从一个基本的AI自动预约客户到自动记录客户的信息再到自动判断下一步如何走全部是AI化的,这是一个真正的AI原生应用,它来自于我的一个大型物业公司用AI自动预约系统中的一部分。我们会使用这个预约流做完整的Dify例子来讲完,因为它太有代表性了。工作流中的控制反转、AI决策下一步怎么走、人为干涉、用户行为判断、外部中间件如Redis,今天我们就要讲到在Dify中调用MongoDB的数据以及企业微信通知来作为预约派单的最后一步了。

打造全国最全的AI Agent开发知识领域的博客 1753

MVC框架比较-struts1、struts2、springMVC

一、性能:          看了几篇关于三者的性能比较的文章:(这些文章和测试我并没有做过实验,仅用于参考)          结论如下:          注:测试都没有数据库,也没有复杂业务,action和jsp中内容很简单,目的就是测试MVC部分的性能。          1.纯JSP的性能应该最高,这不难理解,JSP被编译成Servlet后,没有任何多余的功能,收到请求后直接处理

莫失莫忘-云姐 5889

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Struts1,Struts2,SpringMVC

struts1 1.线程安全: Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。   2.intercepter的实现机制   3.机制: 入口是servlet   4.参数传递   struts2 1.线程模...

iteye_6170的博客 130

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2. 讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么

SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter

yqhp_w 2269

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Servlet、Struts1、Struts2、SpringMVC运行原理

Servlet: Servlet 是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类

占据一方的博客 542

struts1.x、struts2.x和springmvc浅析

入住javaeye也要1年半了,第一次给自己的blog丰富点. 从当前javaEE项目来说,有关view层的框架做个小总结. 一: struts1.x A配置: 1 导入struts1.x的jar包到web-inf/lib下面 2 在web-inf目录下新建struts-config.xml文件,配置struts相关内容 3 web.xml配置加入: action org.apa...

cmtc0147的博客 227

struts1,struts2,springMVC终极对比

最近做项目用到了struts2,之前一直是用struts1和springMVC。感觉到了struts2从很大程度上和这两个还是有很大区别的,所以今天搜集了些资料,给他们做一下对比。            Struts1官方已经停止更新,现在用的也比较少,这里主要讲一下struts2和struts1比较都有哪些不同和进步。Struts2可以说不是完全从struts1改进来的,因为struts2原

zsk 9850

struts1、strutts2、springmvc三者区别

Struts1与Struts2的区别: Struts1中应用范围内action的实例 action是单实例(执行时,先在缓存中查找实例,有用,没有创建新的实例) Struts2中 应用范围内action的实例,每个请求都会创建一个action实例 Servlet属于单实例多线程的应用,实例只在初始化时被加载 多例比单实例的优点,不会产生并发问题,但执行速度不如单实例 Strut2

spy9157的专栏 707

Struts1、Struts2和SpringMVC

这三个框架是按照上面的顺序,依次出现的,它们都是对MVC模式的实现。为什么会出现这三个、甚至更多的MVC框架呢?他们都是为了将URL世界映射到Java世界。尽管它们它们内部的实现思路不同,有着各自的优缺点,但是它们都做到了个自己的使用目的。 历史介绍 大多Web应用程序,都是运行在HTTP上的。HTTP协议是一系列无状态的文本传输协议。无状态的协议不记录收到的多个请求之间的

1191

讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么

SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter

yqhp_w 7658

3.2.1 SpringMVC入门

一、 SpringMVC入门 1. MVC介绍 MVC全名 是Model View Controller, 是模型(model) - 视图(view) - 控制器(controller) 的缩写, 它是一种软件设计典范, 是一种软件架构设计分层模式。 Model( 模型) 是应用程序中用于处理应用程序数据逻辑的部分。View( 视图) 是应用程序中处理数据显示的部分。 Controller...

weixin_30455067的博客 102
上一篇: SpringMVC 1.1——入门
下一篇: SpringMVC 2.1
ack_Finding
博客等级 码龄10年 6粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值