SpringMVC笔记02

第一章响应数据和结果视图

1.返回值分类

1.1字符串(String)类型

  • User.class
public class User {

    private String username;
    private String password;
    private Integer age;
    
    //getter/setter方法
}
  • UserController.class
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 返回值为字符串
     * @param model
     * @return
     */
    @RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("testString执行了....");
        //模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("hk");
        user.setPassword("520");
        user.setAge(18);
        //将数据存入到model对象中
        model.addAttribute("user",user);

        return "success";
    }
}
  • response.jsp
<a href="user/testString">testString</a>
  • success.jsp
<h3>执行成功</h3>

    //从request域中取出数据
    ${user.username}<br>
    ${user.password}<br>
  • 运行结果

1.2void类型

@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 返回值void的
     * 请求转发一次请求,不用编写项目的名称
     * 重写向是再次请求
     * @param
     */
    @RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("testVoid执行了....");
        //请求转发
        //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        //重写向(发送两次请求)
        //response.sendRedirect(request.getContextPath()+"/index.jsp");

        //设置中文乱码
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");


        //直接会进行响应
        response.getWriter().print("何凯");

        return;
    }
}
  • response.jsp
<a href="user/testVoid">testVoid</a>
  • index.jsp
<h1>重写向跳转成功!</h1>

1.3ModelAndView对象

(1)ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
(2)代码实现

  • User.class
public class User {

    private String username;
    private String password;
    private Integer age;
    
    //getter/setter方法
}
  • UserController.class
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 返回ModelAndView对象
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        //创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        System.out.println("testModelAndView方法执行了.....");

        //模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("hkk");
        user.setPassword("5201314");
        user.setAge(18);
        //把user对象存储到mv对象中,也会把user对象存入到request域对象中
        mv.addObject("user",user);
        //跳转到哪个 页面
        mv.setViewName("success");
        return mv;

    }
}
  • response.jsp
 <a href="user/testModelAndView">testModelAndView</a>
  • success.jsp
    <h3>执行成功</h3>


    ${user.username}<br>
    ${user.password}<br>

    <h2>返回ModelAndView对象</h2>
  • 执行结果

2.请求转发和重定向

@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 使用关键字的方式进行转发或者重定向
     * @param
     * @return
     */
    @RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect(){
        System.out.println("testForwardOrRedirect执行了....");
        //转发方式实现页面跳转,相当于request.getRequestDispather("url").forward(request.response)
        // return "forward:/index.jsp";
        //重定向方式,相当于response.sendRedirect(url)
        return "redirect:/index.jsp";
    }
}

注意:在重定向时,如果要重定向某个jsp页面,那么这个jsp页面就不能存放到WEB-INF目录下,否则无法找到。

3.ResponseBody响应json数据

作用:
(1)该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。

3.1DispatherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能使用,解决问题就是要配置静态资源不进行拦截,在springmvc.xml文件中配置如下属性:

例如:
我们使用js绑定一个单击事件时,会运行不出结果,因为是被DispatcherServlet给拦截了,所以我们就设置不过滤就可以了:

  • response.jsp
<head>
    <title>Title</title>
    <%--引入资源--%>
    <script src="js/jquery-1.11.1.js"></script>
    <script>
        //页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
               alert("hello btn");
            });
        });
    </script>
</head>
<body>
    <%-- 模拟异步请求ajax--%>
    <button id="btn">发送ajax的请求</button>
</body>
  • springmvc.xml
 <!-- 前端控制器:哪些静态资源不用拦截-->
 <mvc:resources location="/js/" mapping="/js/**"/>
 <mvc:resources location="/css/" mapping="/css/**"/>
 <mvc:resources location="/images" mapping="/images/**"/>
  • 运行结果

3.2RequestBody获取请求体中的json数据

<head>
    <title>Title</title>
    <%--引入资源--%>
    <script src="js/jquery-1.11.1.js"></script>
    <script>
        //页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
                //alert("hello btn");
                //发送ajax请求
                $.ajax({
                    //编写json格式,设置属性和值
                    url:"user/testAjax",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"hk","password","5201314","age","20"}',
                    dataType:"json",
                    type:"post",
                    success:function (data) {
                        //data服务器端响应的json的数据,进行解析
                    }
                });
            });
        });
    </script>
</head>
    /**
     * 获取请求体中的数据
     * @param body
     */
    @RequestMapping("/testJson")
    public void testJson(@RequestBody String body){
        System.out.println(body);
    }

3.3使用@RequestBody注解把json的字符串转换成JavaBean的对象

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println(user);
    }
}
<head>
    <title>Title</title>
    <%--引入资源--%>
    <script src="js/jquery-1.11.1.js"></script>
    <script>
        //页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
                //alert("hello btn");
                //发送ajax请求
                $.ajax({
                    //编写json格式,设置属性和值
                    url:"user/testAjax",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"hk","password":"5201314","age":"20"}',
                    dataType:"json",
                    type:"post",
                    success:function (data) {
                        //data服务器端响应的json的数据,进行解析
                        alert(data);
                        alert(data.user);
                    }
                });
            });
        });
    </script>
</head>

3.4使用@ResponseBody注解将javaBean对象转换成json字符串,直接响应

@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 模拟异步请求响应
     */
    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax执行了...");
        //客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
        //做响应,模拟查询数据库
        user.setUsername("hkkk");
        user.setAge(18);
        //做响应
        return user;
    }
}
<head>
    <title>Title</title>
    <%--引入资源--%>
    <script src="js/jquery-1.11.1.js"></script>
    <script>
        //页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
                //alert("hello btn");
                //发送ajax请求
                $.ajax({
                    //编写json格式,设置属性和值
                    url:"user/testAjax",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"hk","password":"5201314","age":"20"}',
                    dataType:"json",
                    type:"post",
                    success:function (data) {
                        //data服务器端响应的json的数据,进行解析
                        alert(data);
                        alert(data.username);
                        alert(data.password);
                        alert(data.age);
                    }
                });
            });
        });
    </script>
</head>

6.json字符串和javaBean互转的jackson的jar包

    <!--json转换JavaBean-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

第四章文件上传

  • 文件上传的jar包
    <!--文件上传-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

4.1 传统方式实现文件上传

@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 文件上传
     * @return
     */
    @RequestMapping("/fileupload1")
    public String fileupload1(HttpServletRequest request) throws Exception {
        System.out.println("文件上传.....");

        //使用fileupload组件来完成文件上传
        //上传文件的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        //判断该路径是否存在
        File file = new File(path);
        if (!file.exists()){
            //创建该文件夹
            file.mkdirs();
        }
        //解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        //解析request
        List<FileItem> items = upload.parseRequest(request);
        //遍历
        for (FileItem item : items) {
            //进行判断,当前item是否为上传文件项
            if (item.isFormField()){
                //说明普通表单向
            }else {
                //说明是上传文件项
                //获取上传文件的名称
                String filename = item.getName();
                //把文件的名称设置唯一值,uuid
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"_"+filename;
                //完成文件上传
                item.write(new File(path,filename));
                //删除临时文件
                item.delete();
            }

        }
        return "success";
    }
}
    <%--传统方式上传文件--%>
    <form action="user/fileupload1" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"/>
        <input type="submit" value="上传"/>
    </form>

4.2 SpringMVC的文件上传方式

思路:
  • springmvc.xml
    <!-- 配置文件解析器对象-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>
    </bean>
  • index.jsp
    <%--SpringMVC方式上传文件:注意选择文件中的name要与MultipartFile对象的名称一致--%>
    <form action="user/fileupload2" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"/><br/>
        <input type="submit" value="上传"/>
    </form>
  • UserController.class
@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * SpringMVC文件上传
     * @return
     */
    @RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("SpringMVC文件上传.....");

        //使用fileupload组件来完成文件上传
        //上传文件的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        //判断该路径是否存在
        File file = new File(path);
        if (!file.exists()){
            //创建该文件夹
            file.mkdirs();
        }
        //说明是上传文件项
        //获取上传文件的名称
        String filename = upload.getOriginalFilename();
        //把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        //完成文件上传
        upload.transferTo(new File(path,filename));

        return "success";
    }
}

4.3 SpringMVC跨服务器方式的文件上传

分服务器的目的:
应用服务器:负责部署我们的应用
数据库服务器:运行我们的数据库
缓存和消息服务器:负责处理大并发访问的缓存和消息

文件服务器:负责存储用户上传文件的服务器

(1)配置两个服务器,我们用tomcat来模拟
  • 图片服务器
  • 应用服务器
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 对于java中的思考的方向,1必须要看前端的页面,对于前端的页面基本的逻辑,如果能理解最好,不理解也要知道几点。 ...
    神尤鲁道夫阅读 891评论 0 0
  • 我的环境 idea 2019.1jdk 1.8Spring 5Lombok插件 这里是使用和安装链接(包括idea...
    是小猪童鞋啦阅读 257评论 0 0
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 1,082评论 0 0
  • SpringMVC的笔记 MVC M 代表 模型(Model)模型就是数据,如:dao,bean V 代表 视图(...
    JasonChen8888阅读 435评论 0 1
  • 被名字坑了一把 9月30号中午和姐姐聊天,问我去电影院看《我和我的祖国》么? 看电影我大概率是英语标题党,啥意思,...
    大贝2018阅读 771评论 0 1

友情链接更多精彩内容