SpringMVC 3.x
该篇博文接着上一篇博文的架构继续从零基础实战springmvc
上一篇我们提到了在springmvc中如何请求user文件夹中的user.jsp,那种做法可以通过请求/user访问到user.jsp。
现在我们的新问题是这样的:
我有一个新的UserController,我想让这个Controller中的所有方法都以/user/**来请求
@Controller public class UserController { @RequestMapping("/user/list") public String userList(){ return "user/list"; } @RequestMapping(value="/user/add",method=RequestMethod.GET) public String addForm(){ return "user/add"; } }
这样可以实现,但是不是很方便,我们通过在类上加注解实现namespace
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/list") public String userList(){ return "user/list"; } @RequestMapping(value="/add",method=RequestMethod.GET) public String addForm(){ return "user/add"; } @RequestMapping(value="/add",method=RequestMethod.POST) public String addUser(){ return "user/list"; } }
如果把@RequestMapping后的括号去掉,直接访问/user即可访问仅带有@RequestMapping的方法
注意:一个类中只能存在一个没有配置的方法
@Controller @RequestMapping("/user") public class UserController { @RequestMapping public String userList(){ return "user/list"; } @RequestMapping(value="/add",method=RequestMethod.GET) public String addForm(){ return "user/add"; } @RequestMapping(value="/add",method=RequestMethod.POST) public String addUser(){ return "user/list"; } }
下面说一下URL传参的问题,也就是上一篇中提到的:
/user/1 获取ID=1的用户
这种方法的实现;
@RequestMapping(value="/{id}",method=RequestMethod.GET) public String getUser(@PathVariable int id){ System.out.println(id); return "user/list"; }
通过url传参,{id}表示传入的参数:/user/1,则id=1
在方法的参数列表中需要接收url传来的参数,如果{id}与定义的int id相同,则直接@PathVariable int id即可,如果不同的话,使用下面的方式:
@RequestMapping(value="/{abc}",method=RequestMethod.GET) public String getUser(@PathVariable("abc") int id){ System.out.println(id); return "user/list"; }
这是何必呢,所以我们大多数情况这个变量名是相同的!!!
启动服务器,输入:localhost/user/1
控制台会显示:1
如果要是输入:localhost/user/hh 呢?
肯定是错的呀!!
Problem accessing /user/hh. Reason:
Bad Request
不会在控制台报异常,只是页面请求出现400,我们不想这样!错误了也要给合适的提示,比如没找到就404错误呗!
我们使用正则来约束传入的参数:
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET) public String getUser(@PathVariable int id){ System.out.println(id); return "user/list"; }
再次输入:localhost/user/hh
Problem accessing /user/hh. Reason:
Not Found
现在又有一个问题:
我的用户有两类,一类是学生,一类是老师,学生的ID可能会和老师的ID相同,我如何通过上述一个方法实现对两类用户的访问呢?
我们可以在url添加一个参数type来实现对不同用户的访问!
重载getUser方法如下:
@RequestMapping(value="/{type}/{id:\\d+}",method=RequestMethod.GET) public String getUser(@PathVariable int id,@PathVariable String type){ System.out.println(type+"----"+id); return "user/list"; }
输入:localhost/user/student/11
显示:student---11
使用URL给服务器传值,我们先说这么多,下面我们说一下服务器怎么给页面传值
我们目前不连接数据库,只是熟悉SpringMVC的使用过程,我们创建一个User类!
package com.cn.pojo; public class User { private Integer id; private String name; private String password; 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 getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
我们怎样把一个user对象传给页面呢?
第一种方式:
使用SpringMVC的依赖注入:Model接口(Springframework UI 提供的)
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET) public String getUser(@PathVariable int id,Model model){ System.out.println(id); User user=new User(); user.setId(123); user.setName("tom"); user.setPassword("000000"); model.addAttribute("user", user);//将user装到user中 return "user/list"; }
JSP中使用EL表达式接收:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>list.jsp</title> </head> <body> This is list page. <br> <h1>${user.name }----${user.password }</h1> </body> </html>
第二种方式:
在方法上设置返回值类型为:ModelAndView,使用方法如下:
@RequestMapping(value="/{type}/{id:\\d+}",method=RequestMethod.GET) public ModelAndView getUser(@PathVariable int id,@PathVariable String type){ System.out.println(type+"----"+id); User user=new User(); user.setId(123); user.setName("tom"); user.setPassword("000000"); ModelAndView mav=new ModelAndView("user/list"); mav.addObject("user", user); return mav; }
第三种方式:
让方法的返回类型直接是User,如下:
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET) public User getUser(@PathVariable int id){ System.out.println(id); User user=new User(); user.setId(123); user.setName("tom"); user.setPassword("000000"); return user; }
启动服务器请求:localhost/user/111 是什么效果呢?
Problem accessing /WEB-INF/views/user/111.jsp. Reason:
Not Found
服务器去找:111.jsp了,这明显是错误的嘛!
我们需要再添加注解,在User的前面添加@ResponseBody,或者在方法上面添加@ResponseBody注解,如下:
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET) public @ResponseBody User getUser(@PathVariable int id){ System.out.println(id); User user=new User(); user.setId(123); user.setName("tom"); user.setPassword("000000"); return user; }
或者
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET) @ResponseBody public User getUser(@PathVariable int id){ System.out.println(id); User user=new User(); user.setId(123); user.setName("tom"); user.setPassword("000000"); return user; }
再次启动服务器访问,结果:
Problem accessing /user/111. Reason:
Not Acceptable
不是404了,而是406了!!!
不要灰心,我们马上就要胜利了,就差一步了!!!!
我们还需要在我们的pom.xml中添加一个依赖:jackson-mapper-asl(之前用来返回JSON使用过)
<!-- 用于对@ResponseBody注解的支持 --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.10</version> </dependency>
再次重启,请求,你会看到很友好的JSON返回!!!你还可以在方法的注解中添加类似之前写的response.setContentType("application/json;charset=UTF-8")
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET,produces="application/json;charset=UTF-8") @ResponseBody public User getUser(@PathVariable int id){ System.out.println(id); User user=new User(); user.setId(123); user.setName("tom"); user.setPassword("000000"); return user; }
注意:返回的是JSON,而不是跳转到某一个view。
有些公司的做法是不直接返回获得的对象,而是把返回的对象进行封装进一个叫Result的类中:
package com.cn.dto; public class Result { private String error; private Object obj; public Result(){} public Result(String error, Object obj) { super(); this.error = error; this.obj = obj; } public String getError() { return error; } public void setError(String error) { this.error = error; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } }
dto:Data Translation Object(数据传输对象)
怎么使用呢?把刚才的返回User的方法改造如下:
@RequestMapping(value="/{id:\\d+}",method=RequestMethod.GET,produces="application/json;charset=UTF-8") @ResponseBody public Result getUser(@PathVariable int id){ System.out.println(id); User user=new User(); user.setId(123); user.setName("tom"); user.setPassword("000000"); return new Result("0", user); }
返回的JSON数据如下所示:
{"error":"0","obj":{"id":123,"name":"tom","password":"000000"}}
如果成功了,error=0,如果失败了,error=1呗,接收数据的时候,先判断error再决定后续该干啥!
我们上面详细学习了URL给服务器传值的RESTFUL方式(关于restful请查阅这篇博文http://www.ruanyifeng.com/blog/2011/09/restful.html),服务器给页面传值的三种方式,及跳转到VIEWS并显示值,但是如果我们仍然想使用之前用的很熟练的?传值怎么做呢?
我们举一个小小的例子你就明白了。仍然是注解。
@RequestMapping("/show") @ResponseBody public String showName(@RequestParam String name){ return name; }
请求:localhost/user/show?name=tom
返回的是字符串,@RequestParam表示参数来源与url中?后的name=***。
如果想改变名称:@RequestParam("xingming") String name;你喜欢哪一种方式,自己决定吧!
这样仍然存在一个问题,当你在方法中设置了参数的时候,而你在请求的时候不给它传name,这时是会报错的:
Problem accessing /user/show. Reason:
Required String parameter 'name' is not present
意思是:需要一个为name的参数,而你没有给俺传,给你来个400
怎么解决这个问题呢?
第一种解决方案:设置@RequestParam(required=false)
@RequestMapping("/show") @ResponseBody public String showName(@RequestParam(required=false) String name){ return name; }
第二中解决方案:设置@RequestParam(defaultValue="rose")默认值,如果没传,就给你显示rose
@RequestMapping("/show") @ResponseBody public String showName(@RequestParam(defaultValue="rose") String name){ return name; }
还有一个问题:
我们往往需要执行完一个方法后,跳转到另一个方法,例如:
我执行完添加用户后,我需要跳转到list中去获取最新的用户信息,该怎么办?
操作很简单,执行一下重定向即可!
@Controller @RequestMapping("/user") public class UserController { @RequestMapping public String userList(){ System.out.println("user list..."); return "user/list"; } @RequestMapping(value="/add",method=RequestMethod.GET) public String addForm(){ return "user/add"; } //为了请求的方便,我将请求的method改为GET了! @RequestMapping(value="/save",method=RequestMethod.GET) public String addUser(){ return "redirect:/user"; } }
请求/user/save,则跳转到/user,即userList方法,下跳到user/list.jsp。
最后一个问题:
如果我想使用原来的Request,Response,Application空间,该怎么办呢?
关于这些空间,你需要用的时候,直接拿来用就行了,就跟Model是一样样的!!!
@RequestMapping("/show") @ResponseBody public String showName(@RequestParam(defaultValue="rose") String name,HttpSession session,HttpServletRequest request,HttpServletResponse response,ServletContext application){ return name; }
这些Servlet的API,对象都是依赖注入的,你需要就拿出来用,不需要就算了,太方便了!!!!
相关推荐
springmvc_4\springmvc_4.part1.rar
SpringMVC和MyBatis是Java开发中两个非常重要的框架,它们在构建高效、可维护的Web应用程序中扮演着核心角色。SpringMVC是Spring框架的一部分,主要用于处理HTTP请求和响应,而MyBatis则是一个优秀的持久层框架,...
2. **添加依赖**:在 POM.xml 文件中,你需要添加 Spring MVC 和其他必要的依赖,如 Spring Core、Spring Web、Spring Web MVC、Servlet API、JSTL 等。这将确保项目可以访问到 Spring MVC 的类库。 3. **配置 ...
《SpringMVC与Spring整合及Maven项目结构详解》 在Web开发领域,SpringMVC作为Spring框架的一部分,被广泛用于构建高效的、模块化的后端控制器。本项目以"tmp_springmvc_maven.rar"为载体,展示了如何利用SpringMVC...
总的来说,"SpringMVC_Upload.rar_shipvu7_springmvc_springmvc upload"示例涉及了Spring MVC框架下的多文件上传、返回值处理以及与数据库交互的关键知识点。通过学习和实践这些内容,你可以构建出健壮的Web应用程序...
SpringMVC是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。SpringMVC旨在简化开发,通过解耦业务逻辑、视图呈现和数据访问,使开发者可以更加专注于应用程序的...
SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的请求和响应。在Java世界中,SpringMVC作为轻量级的MVC(Model-View-Controller)架构模式,被广泛应用于构建高性能、可维护的企业级应用。在这个...
2. **SpringMVC框架**:SpringMVC是Spring框架的一部分,用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构模式,帮助开发者将业务逻辑、数据展示和用户交互分离,使得代码更易于维护和测试。 3. **WAR...
这个名为"SpringMVC_01.rar"的压缩包文件显然是一个针对初学者的Spring MVC学习项目,它包含了实现Spring MVC基本功能所需的代码示例,非常适合入门学习。 在Spring MVC中,主要涉及以下几个核心概念: 1. **...
springmvc
Spring、SpringMVC和Mybatis是Java开发中广泛使用的三大框架,它们的整合(SSM)为开发者提供了高效且灵活的Web应用开发解决方案。在这个案例中,我们将深入探讨这三个框架如何协同工作,以及如何实现基本的用户管理...
2. **SpringMVC配置**:在`web.xml`文件中,会配置SpringMVC的DispatcherServlet,它是SpringMVC的入口点,负责接收请求并分发到对应的处理器。 3. **控制器(Controller)**:SpringMVC的控制器通常是使用`@...
SpringMVC是Spring框架的一个模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者将业务逻辑、数据展示和用户界面分离,提高代码的可维护性和可测试性。下面将详细讨论...
《SpringMVC 入门教程:从零开始学习SpringMVC》 在IT行业中,SpringMVC作为一款强大的Web应用程序框架,被广泛应用于Java后端开发。本教程以"springmvc_day01_01_start.zip"为起点,旨在帮助初学者快速掌握...
3. 注册视图解析器:在SpringMVC配置中,添加一个BeetlViewResolver的bean,用于将处理后的结果转换为Beetl模板并渲染。 4. 使用模板:在控制器方法中,返回模板名而不是具体的视图,如"index",SpringMVC会根据...
1.1_SpringMVC_课程介绍.mp4 1.2_SpringMVC_导学.mp4 02_SpringMVC_回顾MVC.mp4 04_SpringMVC_SpringMVC的特点.mp4 06_SpringMVC_HelloWorld:创建maven工程.mp4 10_SpringMVC_HelloWorld:配置springMVC配置文件....
SpringMVC是Spring框架的一个模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够将业务逻辑、数据处理和用户界面分离,从而实现更清晰、更可维护的代码结构。在这个尚硅谷的教程...
3. **SpringMVC与Netty集成**:在SpringMVC应用中集成Netty,通常是为了实现高效的后台服务,例如,通过TCP通信进行大数据传输或实时通信。集成的关键在于创建一个独立于SpringMVC的Netty服务器,作为后台服务,处理...
1. 登录验证,(同时ajax的异步验证) 2. 老师和学生登录后有不同的界面 3. 学生可以给老师留言,并查看自己留言的状态 4. 老师可以对学生进行增删改查,对留言进行处理 5.资源中提供数据库