首页 > 代码库 > SpringMVC视频学习笔记

SpringMVC视频学习笔记

学习MVC框架的流程

1、搭建环境
2、如何完成Controller和Viewer的映射
3、如何把值传递给Controller
6、页面标签
7、文件上传
8、深入一下源代码

基于SpringMVC实现简单的用户管理

技术分享

1、搭建环境

1.导入jar包

a.导入spring的jar包

技术分享

b.导入commons-logging-xxx.jar

技术分享

2.配置web.xml

  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 如果不配置这个,那么 就必须在/WEB-IN/下创建文件名为springmvc-servlet的.xml文件-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <!-- 在src目录下或自己创建的"Source Floder"目录下新建springmvc.xml -->
        <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>/</url-pattern>
  </servlet-mapping>

3.创建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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">


</beans>

1.使用非注解方式进行配置,在springmvc.xml添加如下代码

<!-- 非注解方式 -->
<bean name="/welcome.html" class="com.wen.controller.WelcomeController"></bean>

<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

WellcomeController.java代码如下:

public class WelcomeController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req,
            HttpServletResponse resp) throws Exception {
        System.out.println("Welcome");
        ModelAndView mav = new ModelAndView();
        //则返回的视图为/WEB-INF/jsp/welcome.jsp
        mav.setViewName("welcome");
        //在wellcome.jsp中可以使用${msg}获取‘welcome to spring MVC‘
        mav.addObject("msg", "welcome to spring MVC");
        return mav;
    }

}

上面这种非注解方式来映射视图的方式几乎不会使用

2.使用注解方式

springmvc.xml的配置如下:

<!-- 使用注解方式 -->
<!-- 打开注解 -->
<mvc:annotation-driven/>
<!-- 扫描包 -->
<context:component-scan base-package="com.wen.controller"/>

<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

HelloController.java代码如下:

//@RequestMapping表示用哪个url来对应
@RequestMapping(value=http://www.mamicode.com/{"/hello","/"})
//@RequestParam注解参数
//如http://xxx/hello?username=zhangsan
//使用Map<String, Object> context来将数据传递到hello.jsp页面
public String hello(@RequestParam(value=http://www.mamicode.com/"username",required=false)String name, Map<String, Object> context){
    System.out.println("hello " + name);
    context.put("username", name);
    return "hello";
}

但更建议使用Model来传递数据,代码如下

@RequestMapping(value=http://www.mamicode.com/"welcome")
public String welcome(String username,Model model){
    //使用model.addAttribute来传递数据
    //如http://xxx/welcome?username=zhangsan
    model.addAttribute("msg", "welcome to spring MVC");
    model.addAttribute("name", username);
    return "welcome";
}

4、REST简介

REST的风格不等于使用了REST技术

user为路径,120为user_id
查询用户:user/120———————查询id=120的用户
删除用户:user/120/delete————删除id=120的用户
更新用户:user/120/update———–更新id=120的用户信息

一些技巧

当jsp页面中需要使用标签库时(如:需要使用< c:forEach>)
1.首先需要导入jstl-1.x.jar包
技术分享
2.需要在jsp页面中加入如下代码:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

技术分享

3.同时,需要在springmvc.xml的视图解析器配置中加入如下代码:

<!-- 当要使用taglib标签库是,需要配置这个属性。但spring3.0.5之后默认会加上这个属性 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

技术分享

如果要使用验证,则需要导入下面这个包
技术分享
JSR303使用帮助
用法举例:
在User.java中的get方法上面使用验证注解
技术分享
在Controller方法中:
技术分享
在add.jsp中:
技术分享
结果如下:
技术分享

下面是一个列子

技术分享

User.java
public class User {
    private String username;
    private String password;
    private String nickname;
    private String email;

    //默认构造函数
    public User(){

    }

    public User(String username, String password, String nickname, String email) {
        super();
        this.username = username;
        this.password = password;
        this.nickname = nickname;
        this.email = email;
    }

    //省略setter和getter方法
add.jsp 添加用户的页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>添加用户</title>
  </head>

  <body>
    <!-- modelAttribute="user",会自动将表单中的值添加到User中 -->
    <!-- 此时没有写action,直接提交给/add,但此时是POST方式提交,会 使用method=RequestMethod.POST注解的方法-->
    <sf:form method="post" modelAttribute="user">
        <!-- path相当于input中的name属性 -->
        Username:<sf:input path="username"/><br>
        Password:<sf:password path="password"/><br>
        Nickname:<sf:input path="nickname"/><br>
        Email:<sf:input path="email"/><br>
        <input type="submit" value="添加用户"/>
    </sf:form>
  </body>
</html>
UserController.java
@Controller
@RequestMapping("/user")
public class UserController {

    private Map<String, User> users = new HashMap<String, User>();
    //默认构造函数
    public UserController(){
        users.put("zs", new User("zs", "123", "张三", "123@163.com"));
        users.put("ls", new User("ls", "123", "李四", "234@163.com"));
        users.put("we", new User("we", "123", "王五", "345@163.com"));
        users.put("sj", new User("sj", "123", "世杰", "456@163.com"));
        users.put("yp", new User("yp", "123", "一平", "567@163.com"));
        users.put("ww", new User("ww", "123", "微微", "678@163.com"));
    }

    @RequestMapping(value=http://www.mamicode.com/"/users", method=RequestMethod.GET)
    public String list(Model model){
        model.addAttribute("users", users);
        return "user/list";
    }

    //连接到add页面时是GET请求,会访问这段代码
    @RequestMapping(value=http://www.mamicode.com/"/add", method=RequestMethod.GET)
    public String add(Model model){
        //必须添加一个User,不然在add.jsp中
        //modelAttribute="user"的user无法获取
        model.addAttribute(new User());
        //服务器端跳转:自动加上"forward:"
        return "user/add";
    }

    //除了上面一种方式,我更喜欢下面这种
    //@RequestMapping(value="http://www.mamicode.com/add", method=RequestMethod.GET)
    //public String add(@ModelAttribute("user") User user){ 
    //    return "user/add";
    //} 

    //在具体添加用户时,是POST请求,会访问这段代码
    @RequestMapping(value=http://www.mamicode.com/"/add", method=RequestMethod.POST)
    public String add(User user){
        users.put(user.getUsername(), user);
        //客户端跳转:使用"redirect:"
        return "redirect:/user/users";
    }
}

因为在页面中使用了中文,需要在web.xml中添加字符编码过滤器

  <!-- 编码过滤器 -->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

2016-9-20 23:28:32 未完待续

接续:

5、REST风格实例

1.显示某个用户的信息

list.jsp

技术分享
技术分享

UserController.java
//显示某个用户的方法
//@PathVariable String username表示使用路径中的{username}来最为参数
@RequestMapping(value=http://www.mamicode.com/"/{username}", method=RequestMethod.GET)
public String show(@PathVariable String username, Model model){
    //通过username获得User对象
    //在show.jsp页面中通过${user}来获取对象
    model.addAttribute(users.get(username));
    return "user/show";
}

技术分享

2.更新某个用户的信息

list.jsp 用户列表页面

技术分享

UserController.java

技术分享

update.jsp

技术分享
技术分享

删除用户

list.jsp 用户列表页面

技术分享
技术分享

UserController.java

技术分享

6、其他功能

1.登录

login.jsp

技术分享
技术分享

UserController.java(将图片拖出,放大看)

技术分享
技术分享

UserException.java

技术分享
上面这种异常处理只能处理局部异常,不太好用,所以需要进行前期的异常处理,可以在springmvc.xml配置文件中来配置。
技术分享

error.jsp

技术分享

添加静态文件,如main.css

技术分享

由于在web.xml中配置的DispatchServlet拦截的路径为”/”
所以静态文件也将被servlet拦截,从而无法获取
所以需要在在springmvc.xml中为静态文件进行配置,配置如下
技术分享

在页面中引入静态文件:
技术分享
显示结果如下:
技术分享

7、文件上传

1.导入文件上传所需的Jar包

*这里尽量用最新的jar包,将我用的commons-io-1.4换成commons-io-2.x.jar版本
不然后面会有问题*

技术分享

2.add.jsp中表单的写法

技术分享
技术分享

3.控制层中的写法

技术分享

4.(很重要)需要在springmvc中进行配置,不然无法上传文件

技术分享

5.上面的控制层并没有真正的实现文件上传

只是在控制台打印了上传文件的一些信息
技术分享
现在我们来实现真正的上传文件
技术分享
这个需要贴上代码:

//在具体添加用户时,是POST请求,会访问这段代码
@RequestMapping(value=http://www.mamicode.com/"/add", method=RequestMethod.POST)
public String add(@Valid User user,BindingResult br, @RequestParam("attach") MultipartFile attach,
        HttpServletRequest req) throws IOException{//一定要紧跟Validate之后写验证结果类
    if(br.hasErrors()){
        //如果有错误直接挑战到add视图中
        return "user/add";
    }
    //获得"resources/upload"的实际路径
    String realpath = req.getSession().getServletContext().getRealPath("/resources/upload");
    System.out.println(realpath);
    //获得文件要保存的路径和文件名
    String pathname = realpath + "/" + attach.getOriginalFilename();
    //创建文件
    File f = new File(pathname);
    FileUtils.copyInputStreamToFile(attach.getInputStream(), f);
    System.out.println(attach.getName()+","+attach.getOriginalFilename()+","+attach.getContentType());
    users.put(user.getUsername(), user);
    //客户端跳转:使用"redirect:"
    return "redirect:/user/users";
}

上传成功
技术分享
技术分享

8、多文件上传

1.对add.jsp稍加改动

技术分享
技术分享

2.对UserController.java稍加改动

技术分享
上传成功
技术分享
技术分享
但是,这里有一个问题需要特别注意
技术分享
技术分享
怎么解决?很简单,看下面
技术分享
好了,文件上传就讲到这里就应该差不多了吧,呵呵。

9、使用JSON

终于讲到这里了,真是要哭了,555555~~~

springmvc怎么返回JSON数据?

1.导入jackson的jar包

技术分享

2.编写Controller

技术分享

3.结果比较

使用@RequestBody注解和jackson :
技术分享
不使用它们:
技术分享

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    SpringMVC视频学习笔记