JAVA中注解controller_SpringMVC之基于注解的Controller

参考博客:https://www.cnblogs.com/qq78292959/p/3760560.html

Controller注解:

传统风格的Controller需要实现Controller接口,而现在我们只需要用注解就行了。

基于注解的控制器有几个优点,1.一个控制器可以处理多个action(动作),而一个实现 Controller接口的控制器只能处理一个动作。    2.基于注解的控制器请求映射不需要存储在配置文件中,使用RequesetMapping注解类型就可以对一个方法进行请求处理。

要写一个Controller,你只需要用  org.springframework.stereotype.Controller注解类型去注解

@Controllerpublic classCustomerController {//请求方法

}

Spring用扫描机制来找到应用程序中所有基于注解的控制器类。为了Spring能找到你的控制器,你需要做两件事:

1.在spring的配置文件中声明Spring-context,如下:

xmlns:context:="http:www.springframework.org/schema/context"...>

2.然后还需要饮用元素

请在元素中指定控制器类的基本包。请确保所有控制器类都在基本包下,并且不要指定一个太广泛的基本包,因为这样会使得SpringMVC扫描了太多无关的包。

RequestMaping注解类型:

现在我们要在控制类的内部为每一个动作开发相应的处理方法。要让Spring知道用哪一种方法来处理它的动作,需要使用org.springframework.web.bind.annotation.RequestMapping注解类型映射的URL和方法。         可以用  @RequestMapping注解一种方法或类。

一个采用@RequestMapping注解的方法将成为一个请求的处理方法。

@Controllerpublic classCustomerController {

@RequestMapping(value="/customer_input")

public String inputCustomer()

{//do somethimg

return"CustomerFrom";

}

}

value属性将把URL映射到方法。当你用如下的URL就会访问到inputCustomer方法。

http://domin/context/customer_input

value属性是RequestMapping注解的唯一默认属性,因此如果只有这个属性,value可以省略不写:@RequestMapping("/customer_input")

RequestMapping除了value属性外还有其他属性,method属性来指示该方法仅处理那些HTTP方法。下面这行注释代表着只有用HTTP POST方法或PUT方法的时候才调用这个请求方法。

@RequestMapping(value="/order_process",method={RequestMethod.POST,RequestMethod.PUT})

若method属性只有一个HTTP方法值,则无需花括号:

@RequestMapping(value="/order_process",method=RequestMethod.POST)

@RequestMapping也能注解一个类,这时所有的方法都将映射为相当于类级别的请求,看个例子:

@Controller

@RequestMapping(value="/customer")public classCustomerController {

@RequestMapping(value="/delete",method={RequestMethod.POST,RequestMethod.PUT})publicString deleteCustomer() {//...

return...;

}

}

输入下面的URL会映射到deleteCustomer方法:    http://domin/context/customer/delete

还有其他属性:

2、 consumes,produces;

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

3、 params,headers;

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

其他属性可以参考博客:https://www.cnblogs.com/qq78292959/p/3760560.html

请求方法接收的参数和返回值:

每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。例如如果请求处理方法中需要访问HttpSession对象,则可以添加HttpSession作为参数。Spring会将对象正确地传递给方法。  可以处理方法可以有这些参数:

org.springframework.web.context.request.WebRequest

org.springframework.web.context.request.NativeWebRequest

java.util.Locale 当前请求的语言环境

java.util.TimeZone 时区

java.io.InputStream或java.io.Reader

java.io.OutputStream或java.io.Writer

org.springframework.http.HttpMethod

java.security.Principal

HttpEntity >参数用于访问Servlet的HTTP请求的标题和内容

java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap 视图隐含模型

org.springframework.web.servlet.mvc.support.RedirectAttributes 重定向

命令或表单对象

基本数据类型,如int,String,double...

复杂数据类型,如自定义的POJO对象

HandlerAdapter

org.springframework.validation.Errors / org.springframework.validation.BindingResult 验证结果

org.springframework.web.bind.support.SessionStatus 会话状态

org.springframework.web.util.UriComponentsBuilder

@PathVariable 注解参数访问URI模板变量。

@MatrixVariable 注释参数用于访问位于URI路径段键值对对,矩阵变量。

@RequestParam 注解参数访问特定的Servlet请求参数,请求参数绑定。

@RequestHeader 注解参数访问特定的se​​rvlet请求HTTP标头,映射请求头。

@RequestBody 注解参数访问HTTP请求主体,注解映射请求体

@RequestPart 注解参数访问“的multipart / form-data的”请求部分的内容。处理客户端上传文件,多部分文件上传的支持

@SessionAttribute 注解参数会话属性

@RequestAttribute 注解参数访问请求属性

注意这个org.springframework.ui.Model,这不是个servlet API的类型,而是一个包含Map的StringMVC类型,每次调用请求处理方法的时候,SpringMVC都会创建Model对象并将各种对象注入到Map中。要使用这个model的话,你只要在请求方法中加入这个参数就行了。

请求方法中可以有这些返回值:

ModelAndView

Model

ModelMap

Map(包含模型的属性)

View

String(代表逻辑视图名)

Void

提供对servlet的访问以及相应HTTP头部和内容HttpEntity或ResponseEntity对象

Callable

DeferredResult

其他任意类型,Spring将视其作输出给View的对象模型

@Autowired和@service注解的依赖注入:

将依赖注入到SpringMVC最简单的方法就是通过注解@AutoWired到字段或者方法。这个注解属于类型org.springframeword.beans.factory.annotation包。

此外,为了能依赖注入,类必须注明为@Service,该类型是org.springframeword.stereotype包的成员,Service注解类型指示类是一个服务,此外在spring的配置文件中还要添加一个元素来扫描依赖基本包。

用的时候就:

//ProductService接口

public interfaceProductService {

Product add(Product product);

Product get(longid);

}//ProductServiceImpl类

@Servicepublic class ProductServiceImpl implementsProductService {

...

Product add(Product product) {

..return..;

}

Product get(longid) {

..return..;

}

}

Controller里面

@Controllerpublic classProductController {

@Autowiredprivate ProductService productService;//注入实例,我们的的Service是个ProductService的实现类,所以这里也有多态的味道

....

....

}

重定向和Flash属性:

比重定向快,因为重定向要经过客户端。 有时候,为了避免用户在重新加载界面的时候,因为如果是同一个url,容易再次调用同一个动作,例如成功提交表单后重新加载后又提交了一次。                为了避免这种现象,我们可以在提交表单后将用户重定向到一个不同的页面。

在Controller的方法中返回:

return:"redirect:/product_view/"+saveProduct.getId();

这里的id是另外生成的,那么就可以防止saveProduct这个action被重复调用。但这个时候也有个不方便的地方,就是我们无法方便地传值给目标页面,因为这是两个不同的request和response,不能像转发一样简单地把属性添加到Model中,幸运的是Spring3.1版本以后提供了Flash属性——一种供重定向传值的方法。

要使用Flash属性,必须在SpringMVC配置文件中有一个元素。然后还要在方法中添加一个新的参数:RedirectAttributes redirectAttributes ,这个类来自org.springframework.web.servket.mvd.support.RedirectAttributes

看个例子:

@RequestMapping(value="product_save")publicString saveProduct(ProductForm productForm,RedirectAttributes redirectAttributes) {

....

redirectAttributes.addFlashAttribute("message","the product was successfully added");return "redirect:/product_view/"+saveProduct.getId();

}

请求参数和路径变量:

请求参数就是url中的请求参数,想这个url有一个名额为productId的请求参数,其值为3:

http://localhost:8080/app18b/product_retrieve?productId=3

在传统的servlet编程中,我们用HttpServletRequest.getParameter("")来获取,现在我们可以通过org.springframework.web.bind.annotation.RequestParam注解类型来获取请求参数,只要用这个注解在方法参数中注解就行:

public void sendProduct(@RequestParam int productId)

可以理解成调用了

int productId = Integer.parse(request.getParameter("productId")) ;

可见这个注解的参数不一定是字符串

路径变量就是url中的变量,像url         /product_view/productId

其中的productId是表示铲平标识符的整数,它是url中的一部分,叫做路径变量。下面这个例子看看路径变量的使用:

@RequestMapping("/product_view/{id}")public String viewProduct(@PathVariable longid, Model model) {

Product product=productService.get(id);

model.addAttribute("product",product);return "ProductView";

}

为了使用路径变量,首先要在RequestMapping注解的值属性中加一个变量,这个变量必须放在花括号里。像上面的{id}     然后在方法签名中添加一个同名变量,并加上@PathVariable注解,然后当该方法被调用的时候,url中的这个id就会被复制到方法参数中,然后就可以使用了。   路径变量可以不是字符串,SpringMVC会尽力转换费字符串类型。

@ModuleAttribute:

前面谈到,SpringMVC每次调用请求处理方法的时候,都会创造一个Model类型的一个实例,若打算用这个实例,则可以在方法中添加一个Model类型的参数。事实上可以在方法参数中添加ModelAttribute注解类型来访问Model实例。  这个注解类型也是org.springframework.web.bind.annotation包的成员。

可以用这个注解来注解方法参数或者方法。  带@ModelAttribute注解的方法参数,方法会将其输入或创建的参数对象添加到Model对象中。(若方法中没有闲式地添加)

如       @RequestMapping("xxx")public String submitOrder(@ModelAttribute("newOrder")  Order order  , Model model ) {   .....  }

输入或创建的Order实例将用newOrder为键名添加到Model对象中。如果没有定义键的名字,则将使用该对象的名称     @ModelAttribute Order order    那么键值就是order

该注解也可以用来标注一个非请求的处理方法。  被@ModelAttribute注解的方法会在每次调用该控制器类的请求方法时被调用(在请求方法之前被调用),这个方法可以返回一个对象或一个void类型。如果返回一个对象,则返回对象会自动添加到Model中;如果返回void,则还需要添加一个Model类型的参数,并自行将实例添加到Model中。

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

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

相关文章

c java json_cJSON_json包的C语言解析库

cJSON库描述CJSON是一个用于解析JSON包的C语言库,库文件为cJSON.c和cJSON.h, 所有的实现都在这两个文件中。原作者的地址cJSON。JSON包的解析例如有一个JSON的数据包如下:{"rxpk": [{"tmst": 1868500100,"time"…

e语言mysql中文_大佬们E语言连接MYSQL输出中文乱码怎么破

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼.版本 2.支持库 mysql.支持库 iext.程序集 窗口程序集_启动窗口.子程序 _按钮1_被单击数据库连接句柄 = 连接MySql (“127.0.0.1”, “root”, “zkqingfish*”, “mu_game_1”, 3306) 执行SQL语句 (连接句柄, “set na…

java中删除最大的数,【Java练习】删除字符串中字符个数最少的字符

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼输入:asdasdas输出:asasas[java] view plain copyprint?1.package com.iotex;2.3.import java.util.ArrayList;4.import java.util.Collections;5.import java.util.Comparator;6.import java.util.HashMap…

php实时上传多张图片,PHP实现多张图片上传预览功能

PHP实现多张图片上传预览功能,支持左右移动图片切换位置、删除图片,限制图片上传的数量等-向左移动图片function reverse_left(obj) {var obj_li obj.parents("li");var obj_prev obj_li.prev("li");if (obj_prev.hasClass("…

centos php 默认安装目录,centos系统中的软件安装目录在哪

centos系统中软件的默认安装目录一般在/usr/local或者/opt中。我们还可以通过whereis命令来查看软件的实际安装路径。命令:whereis功能介绍:在特定目录中查找符合条件的文件。这些文件的烈性应属于原始代码,二进制文件,或是帮助文…

php代码丑,php – 屏幕截图你生命中见过的最丑陋的HTML

我正在使用PHP和libtidy来尝试筛选可能是历史上最糟糕和最不正确的HTML表格使用情况.该站点关闭了几个table,tr,td,font或bold标签,并且一致地嵌套了表中的许多不同的表层.示例代码段:Home Team - WildcatsAway Team - Polar BearsRosters1 Baird, T2 Knight, P8 Mi…

百度指数 php,百度指数是什么?百度指数有什么用?百度指数怎么用?

做SEO必知的第一步:百度指数【百度指数地址】百度指数是用以反映关键词在过去30天内的网络曝光率及用户关注度! 它能形象地反映该关键词的每天的变化趋势!百度指数是以百度网页搜索和百度新闻搜索为基础的免费海量数据分析服务,用…

php获取全部sessionid,php怎么获取所有的sessionid?或获取所有的session

php怎么获取所有的sessionid?或获取所有的sessionphp 如何获取所有的 sessionid ?或获取所有的session就是想通过一个.php文件读取所有的 sessionid ?或获取所有的session ??sessionphp------解决方案----------------…

php atlas,apache atlas是什么

Atlas是一组可伸缩和可扩展的核心基础治理服务——使企业能够有效和高效地满足Hadoop中的遵从性需求,并允许与整个企业数据生态系统进行集成。Apache Atlas为组织提供开放的元数据管理和治理能力,以建立其数据资产的目录,对这些资产进行分类和…

matlab heaviside,Matlab编写的Lyapunov指数计算程序汇总.doc

Matlab编写的Lyapunov指数计算程序汇总matlab编写的Lyapunov指数计算程序汇总申明:以下各程序为个人在网络上收集的Lyapunov指数计算程序,未经过验证,不保证程序的正确性和计算结果的正确性,请大家见谅,也欢迎大家探讨…

php2588,搞清楚一下必胜2588z和2582z哪个好点?都有些什么区别?内幕评测分析

这二个必胜2588z和2582z区别不是很大的哈,款式和配置是差不多的,只是必胜2582Z 2052Z更强一些,看个人需要吧,不过家用的话,这两款都是可以的,我自己用的是必胜2582Z 2052Z,款式多大气的&#xf…

超表面透镜相位matlab,基于超透镜的小F数大景深镜头的设计方法及应用与流程...

本发明涉及基于超透镜的小f数大景深镜头的设计方法及应用。背景技术:监控系统中采用的透镜往往要求具有尽量高的成像分辨率和尽量大的景深,通常情况下,高分辨率的透镜一般具有较小f数,大的景深又要求焦距较短。但是利用传统透镜的…

获取php数组最后,php获取数组最后一个值的2种方法

摘要:这篇文章主要介绍了PHP获取数组最后一个值的2种方法,本文直接给出实现代码,代码中包含注释,需要的朋友可以参考下$arrayarray(1,2,3,4,5);echo $array[count($array)-1];//计算数组长度,然后获取数组最后一个元素,如果数组中最后一个元素…

php等级证书,php银行开放平台接口1:php 对cer证书处理

做一个银行接口要进行证书解析和签名,然后验证获token银行开放平台提供了2个证书public.cer 证书 :里面只有公钥200090491595.pfx证书 :里面有公钥和私钥这里专门做public.cer的说明和处理,.cer为扩展的证书,就是一个x…

php theexcerpt,wordpress的excerpt()函数的用法示例

本篇文章给大家带来的内容是关于wordpress的excerpt()函数的用法示例&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。问题&#xff1a;在wordpres中的single页面&#xff0c;本身引用的<?php the_excerpt(); ?>&…

php查找以xx结尾的的字符串单词,Javascript中查找不以XX字符结尾的单词示例代码_javascript技巧...

首先&#xff0c;让我声明一下&#xff0c;我在写这篇文章之前花了2个多小时在弄正则表达式。悲~悲~悲~按照一般的思路&#xff0c;先来看看其他几个插找方式&#xff1a; 我以字符串var str "eattd gebcat gedat jadu geat beu";為例子。1.以"ge"為开头的…

oracle安装 衍生进程已退出,linux安装oracle 出现问题

linux安装oracle 出现问题0出现错误以后&#xff0c; 图片已经插入请看&#xff0c;然后 我查过资料&#xff0c;说要安装binutils-2.15.92.0.2-13.0.0.0.2.x86_64.rpm但是我安装的时候&#xff0c;他说要依赖文件&#xff0c;我就不知道依赖文件是什么请问一下&#xff0c;依赖…

oracle 9i hwm,Oracle 10g HWM原理及性能优化

摘 要: HWM(High Water Mark)是表中已经使用过的存储空间与未使用过的存储空间之间的分界线&#xff0c;HWM对全表扫描的性能有非常大的影响。当全表扫描时&#xff0c;Oracle会读取HWM下所有的块&#xff0c;即使这些块中有很多是空块&#xff0c;空块的存在&#xff0c;也即是…

php的curl如何返回值,怎么在PHP中利用CURL获取返回值

怎么在PHP中利用CURL获取返回值发布时间&#xff1a;2021-01-05 16:58:39来源&#xff1a;亿速云阅读&#xff1a;96作者&#xff1a;Leah怎么在PHP中利用CURL获取返回值&#xff1f;针对这个问题&#xff0c;这篇文章详细介绍了相对应的分析和解答&#xff0c;希望可以帮助更多…

oracle安装后开机很慢,Windows下安装Oracle拖慢开机速度的解决方法

环境&#xff1a;win7 oracle R2方法&#xff1a;将安装Oracle后自动开机启动的服务改为手动启动步骤如下&#xff1a;1、修改服务项Ctrl R&#xff0c;输入services.msc&#xff0c;打开服务列表&#xff0c;找到Oracle相关的服务项&#xff0c;右击属性将启动类型改为手动2…