列位看官,上篇介绍了springMVC的工作流程以及基于此的编程步骤,但实际开发过程中一般都不这么干,就如spring有注解标识bean等简化spring的开发流程,减少配置过程,那springMVC也就有基于注解的开发过程,接下来我们就介绍下:
一.基于注解的SpringMVC开发步骤:
开始的步骤与上篇相同,就直接复制了
- 导包,导入springMVC的jar包
- 如果是maven工程,则添加依赖,配置的pom.xml文件如下:
-
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.1.RELEASE</version> </dependency> </dependencies>
- 添加配置文件(springmvc.xml)
- 从网上找了一份复制如下:
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd"> </beans>
- 配置DispatchServlet(前端控制器)到web.xml
-
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
-
- 还是编写起controller作用的类,但 与上篇不同,有几个改进点
- 不再实现Controller接口,使用@Controller注解替代,同时也无须在spingmvc.xml配置该controller Bean
- 处理器方法不再是handlerRequest,可以命名为其他的,方法名不作要求
- 处理器可以添加多个方法处理多个请求路径的请求,每个方法处理一种类型的请求,只要在方法前加@RequestMapping("请求路径"),告诉DispatcherServlet(前端控制器)请求路径与方法的对应关系,同理也无须再springmvc.xml文件中配置HandlerMapping
- 处理方法的返回对象即可以是ModelAndView对象,也可以是String(代表视图名)
-
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping("/hello.do") public String sayHeelo(){ System.out.println("hello!!!!"); return "hello"; } }
- 然后再配置springmvc.xml,此次配置就与上次不同了
- 配置组件扫描
- 配置mvc注解
- 配置视图解析器
-
<!-- 配置组件扫描 --> <context:component-scan base-package="controller" /> <!-- 配置mvc注解 --> <mvc:annotation-driven /> <!-- 配置视图解析器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>
- 编写具体的视图对象,如jsp页面,以便响应给用户
- 编写一个hello.jsp页面在WEB-INF目录下
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>hello</title> </head> <body> <h1>Hello,SpringMVC!</h1> </body> </html>
- 加载到tomcat容器运行,然后访问 http://localhost:8080/springmvc01/hello.do (注:springmvc01是你的工程名)运行界面如下:
二.其他
- 读取请求参数值:
- 通过request对象(将request对象作为方法的入参即可)
- 在处理方法里添加HttpServletRequest入参
- 以处理登录页面请求为例:
-
@RequestMapping("login.do") public String Login(HttpServletRequest request){ String username=request.getParameter("username"); String password=request.getParameter("password"); System.out.println("username:"+username+" password:"+password); return "hello"; }
- 使用@RequestParam注解(将注解添加到方法的入参前面即可)
- 当处理方法里面的形参名与表单里元素name值一致时,可以不用注解(平时最好加上注解,避免出错)
-
@RequestMapping("login2.do") public String login2(String username,String password){ System.out.println("username:"+username+" password:"+password); return "hello"; }
- 当处理方法的形参名与request.getParameter("arg0")里面的arg0即实际参数名不一致时,可以使用@RequestParam注解
-
@RequestMapping("login2.do") public String login2(String username,@RequestParam("password") String pwd){ System.out.println("username:"+username+" password:"+pwd); return "hello"; }
- 使用javaBean封装请求参数值
- 写一个java类,封装请求参数。其中与实际参数严格保持一致,
- 然后将该javaBean作为方法的入参。
-
public class LoginParam { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
@RequestMapping("login3.do") public String login3(LoginParam loginParam){ System.out.println("username:"+loginParam.getUsername()+" password:"+loginParam.getPassword()); return "hello"; }
- 通过request对象(将request对象作为方法的入参即可)
- 向页面传值:
- 仍然通过request对象
- 使用setAttribute将数据绑定到request对象,然后转发到jsp(注:springmvc默认使用转发)
-
@RequestMapping("login4.do") public String login4(LoginParam loginParam,HttpServletRequest request){ System.out.println("username:"+loginParam.getUsername()+" password:"+loginParam.getPassword()); //将数据绑定到request request.setAttribute("username", loginParam.getUsername()); //springMVC默认使用转发,即request.getRequestDispatcher(arg0) return "hello"; }
- 使用ModelAndView
- 将数据封装到ModelAndView对象里面,然后将该对象作为方法的返回值
-
//向页面传值 @RequestMapping("login5.do") public ModelAndView login5(LoginParam loginParam){ System.out.println("username:"+loginParam.getUsername()+" password:"+loginParam.getPassword()); Map<String,Object> data=new HashMap<String,Object>(); //相当于request.setAttribute("username", loginParam.getUsername()); data.put("username", loginParam.getUsername()); //构造ModelAndView对象 ModelAndView mav=new ModelAndView("hello",data); return mav; }
jsp页面用EL表达式呈现
-
<body> <h1>Hello,SpringMVC!</h1> <h1>welcome ${username}</h1> </body>
- 使用ModelMap
- 将该对象作为方法的入参,然后将数据绑定到该ModelMap对象上,使用modelMap.addAttribute()方法
-
//向页面传值 @RequestMapping("login6.do") public String login6(LoginParam loginParam,ModelMap modelMap){ System.out.println("username:"+loginParam.getUsername()+" password:"+loginParam.getPassword()); //相当于request.setAttribute modelMap.addAttribute("username",loginParam.getUsername()); return "hello"; }
- 使用session
- 将HttpSession作为方法的入参,然后将数据绑定到session对象上即可
-
//向页面传值 @RequestMapping("login7.do") public String login7(LoginParam loginParam,HttpSession session){ System.out.println("username:"+loginParam.getUsername()+" password:"+loginParam.getPassword()); session.setAttribute("username", loginParam.getUsername()); return "hello"; }
- 仍然通过request对象
- 重定向
- 如果方法的返回值是String
- 在重定向地址前加“redirect:”,
- return "redirect:toIndex.do";
-
1 //重定向 2 @RequestMapping("login8.do") 3 public String login8(){ 4 return "redirect:hello.do"; 5 }
- 如果方法的返回值是ModelAndView
- 使用RedirectView 对象
-
//重定向 @RequestMapping("login9.do") public ModelAndView login9(){ RedirectView rv=new RedirectView("hello.do"); return new ModelAndView(rv); }
- 如果方法的返回值是String