SpringMVC入门(二)

  列位看官,上篇介绍了springMVC的工作流程以及基于此的编程步骤,但实际开发过程中一般都不这么干,就如spring有注解标识bean等简化spring的开发流程,减少配置过程,那springMVC也就有基于注解的开发过程,接下来我们就介绍下:

一.基于注解的SpringMVC开发步骤

  开始的步骤与上篇相同,就直接复制了  

  1. 导包,导入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>
  2. 添加配置文件(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>
  3. 配置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> 
  4. 还是编写起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";
          }
      }
  5. 然后再配置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>
  6. 编写具体的视图对象,如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>
  7. 加载到tomcat容器运行,然后访问 http://localhost:8080/springmvc01/hello.do  (注:springmvc01是你的工程名)运行界面如下:

 二.其他

  1. 读取请求参数值
    1. 通过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";
            }
    2. 使用@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";
            }
    3. 使用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";
            }
  2. 向页面传值
    1. 仍然通过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";
            }
    2. 使用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>
    3. 使用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";
            }
    4.  使用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";
            }
            
  3. 重定向
    1. 如果方法的返回值是String
      • 在重定向地址前加“redirect:”,
      • return "redirect:toIndex.do";
      • 1 //重定向
        2     @RequestMapping("login8.do")
        3     public String login8(){        
        4         return "redirect:hello.do";
        5     }
    2. 如果方法的返回值是ModelAndView
      • 使用RedirectView 对象
      •     //重定向
            @RequestMapping("login9.do")
            public ModelAndView login9(){
                RedirectView rv=new RedirectView("hello.do");
                return new ModelAndView(rv);
            }
原文地址:https://www.cnblogs.com/hijackhou/p/9418790.html