`

SpringMVC_3.x_入门指南_2

阅读更多

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 呢?
肯定是错的呀!!

写道
HTTP ERROR 400

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

 

写道
HTTP ERROR 404

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  是什么效果呢?

 

写道
HTTP ERROR 404

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;
}

  再次启动服务器访问,结果:

 

写道
HTTP ERROR 406

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,这时是会报错的:

写道
HTTP ERROR 400

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_4\springmvc_4.part1.rar

    springmvc_learning.rar

    SpringMVC和MyBatis是Java开发中两个非常重要的框架,它们在构建高效、可维护的Web应用程序中扮演着核心角色。SpringMVC是Spring框架的一部分,主要用于处理HTTP请求和响应,而MyBatis则是一个优秀的持久层框架,...

    SpringMvc_Maven.zip_java项目_maven_maven springmvc_springmvc maven

    2. **添加依赖**:在 POM.xml 文件中,你需要添加 Spring MVC 和其他必要的依赖,如 Spring Core、Spring Web、Spring Web MVC、Servlet API、JSTL 等。这将确保项目可以访问到 Spring MVC 的类库。 3. **配置 ...

    tmp_springmvc_maven.rar

    《SpringMVC与Spring整合及Maven项目结构详解》 在Web开发领域,SpringMVC作为Spring框架的一部分,被广泛用于构建高效的、模块化的后端控制器。本项目以"tmp_springmvc_maven.rar"为载体,展示了如何利用SpringMVC...

    SpringMVC_Upload.rar_shipvu7_springmvc_springmvc upload

    总的来说,"SpringMVC_Upload.rar_shipvu7_springmvc_springmvc upload"示例涉及了Spring MVC框架下的多文件上传、返回值处理以及与数据库交互的关键知识点。通过学习和实践这些内容,你可以构建出健壮的Web应用程序...

    SpringMVC_JDBC.zip_springmvc

    SpringMVC是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。SpringMVC旨在简化开发,通过解耦业务逻辑、视图呈现和数据访问,使开发者可以更加专注于应用程序的...

    springmvc_demo.zip

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的请求和响应。在Java世界中,SpringMVC作为轻量级的MVC(Model-View-Controller)架构模式,被广泛应用于构建高性能、可维护的企业级应用。在这个...

    Tomcat 部署 war 源文件 springmvc_war.zip

    2. **SpringMVC框架**:SpringMVC是Spring框架的一部分,用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构模式,帮助开发者将业务逻辑、数据展示和用户交互分离,使得代码更易于维护和测试。 3. **WAR...

    SpringMVC_01.rar

    这个名为"SpringMVC_01.rar"的压缩包文件显然是一个针对初学者的Spring MVC学习项目,它包含了实现Spring MVC基本功能所需的代码示例,非常适合入门学习。 在Spring MVC中,主要涉及以下几个核心概念: 1. **...

    springmvc_4\springmvc_4.part2.rar

    springmvc

    Spirng_SpringMVC_Mybatis.zip

    Spring、SpringMVC和Mybatis是Java开发中广泛使用的三大框架,它们的整合(SSM)为开发者提供了高效且灵活的Web应用开发解决方案。在这个案例中,我们将深入探讨这三个框架如何协同工作,以及如何实现基本的用户管理...

    springmvc_demo.7z

    2. **SpringMVC配置**:在`web.xml`文件中,会配置SpringMVC的DispatcherServlet,它是SpringMVC的入口点,负责接收请求并分发到对应的处理器。 3. **控制器(Controller)**:SpringMVC的控制器通常是使用`@...

    springmvc_day01_01_start.zip

    《SpringMVC 入门教程:从零开始学习SpringMVC》 在IT行业中,SpringMVC作为一款强大的Web应用程序框架,被广泛应用于Java后端开发。本教程以"springmvc_day01_01_start.zip"为起点,旨在帮助初学者快速掌握...

    SpringMVC_beetl.rar_beetl_sheep8on_springmvc

    3. 注册视图解析器:在SpringMVC配置中,添加一个BeetlViewResolver的bean,用于将处理后的结果转换为Beetl模板并渲染。 4. 使用模板:在控制器方法中,返回模板名而不是具体的视图,如"index",SpringMVC会根据...

    2021全新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配置文件....

    1. 尚硅谷_佟刚_SpringMVC_概述.zip

    SpringMVC是Spring框架的一个模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够将业务逻辑、数据处理和用户界面分离,从而实现更清晰、更可维护的代码结构。在这个尚硅谷的教程...

    springMVC_netty.rar

    3. **SpringMVC与Netty集成**:在SpringMVC应用中集成Netty,通常是为了实现高效的后台服务,例如,通过TCP通信进行大数据传输或实时通信。集成的关键在于创建一个独立于SpringMVC的Netty服务器,作为后台服务,处理...

    springmvc_2020.rar

    1. 登录验证,(同时ajax的异步验证) 2. 老师和学生登录后有不同的界面 3. 学生可以给老师留言,并查看自己留言的状态 4. 老师可以对学生进行增删改查,对留言进行处理 5.资源中提供数据库

    springmvc_cxf_hibernate.zip

    总的来说,"springmvc_cxf_hibernate.zip"是一个展示Spring MVC、CXF和Hibernate集成的实践案例,对于想要提升企业级Web应用开发技能的学习者来说,这是一个宝贵的学习资源。通过深入研究这个项目,开发者不仅可以...

Global site tag (gtag.js) - Google Analytics