SpringMvc

SpringMvc

第一次写博客,感觉写的不是很不好,如果当中有啥bug,欢迎大家讨论

1.     mvc框架做那些事情

a,将一个url映射到一个java类,或者java的方法

b.封装用户提交的数据

c.处理请求,调用相关的业务处理——封装相应的数据

d.将响应的数据进行渲染,返回给jsp,html,freemarker等

2,springmvc是一个轻量级的基于请求响应的mvc框架

3,特点:

简单,易学,开发效率高(可以使用注解开发)

但是性能低(创建一套完整的mvc框架),

天生和spring无缝集成(使用spring aop,ioc)

使用约定由于配置

支持Result风格

异常处理

数据验证,类型转换,拦截器等

使用的人多,公司多

 

4:结构图

简单案列及其常见配置

 

1  配置:首先导入相关的jar包

 

2  配置web.xml文件

<!-- 配置springmvc文件 -->

  <servlet>

        <servlet-name>springmvc</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

        <param-name>contextConfigLocation</param-name>

        <!-- 此配置为将springmvc的配置文件纺织在src地下,文件名字为:springmvc.xml -->

        <param-value>classpath:springmvc.xml</param-value>

        </init-param>

        <!-- 配置springmvc容器随tomcat一起启动 -->

        <load-on-startup>1</load-on-startup>

  </servlet>

  <!-- 如果请求我*.do则执行继续执行 -->

  <servlet-mapping>

  <servlet-name>springmvc</servlet-name>

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

 

3  配置springmvc文件(此文件为web.xml<param-value>classpath所指定的文件

<?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"

    xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

       

    <!-- 配置handerAdapter  适配器 -->

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

  

   <!-- 配置视图渲染器 -->

    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

        <!-- 将视图名渲染后视图的前缀 -->

        <property name="prefix" value="/WEB-INF/jsp/"/>

        <!-- 渲染后视图的后缀 -->

        <property name="suffix" value=".jsp"/>

        <!-- 例:视图名为:hello   渲染后:/WEB-INF/jsp/hello.jsp 该页面-->

    </bean>

   

    <!-- 最常用的就是通过注解开发,简单高效,最为常用,可以配置多个包,用来进行扫描 -->

    <!-- spring容器扫描指定包下的所有类,如果类上有注解  那么根据注解产生相应bean对象已经映射信息 -->

    <context:component-scan base-package="com.springmvc"/>

     <mvc:annotation-driven />

</beans>

4  Controler代码:

将数据封装显示到表示层页面一般有两种,ModelAndViewModelMap

相同点:都可以讲数据解析到jsp页面

不同点:ModelAndView可以指定跳转视图但是ModelMap不能

ModelAndView需要视图解析器

ModelMap不需要

 

@Controller

publicclass SpringMvc {

 

    //通过视图解析器将数据解析到jsp页面

    @RequestMapping("/hello")

    public ModelAndView hello(HttpServletRequest req,HttpServletResponse resp){

        ModelAndView mv = new ModelAndView();

        System.out.println("你好世界");

        //相当于req.setAttribute("hello", "你好spingmvc,最流行的框架之一");

        mv.addObject("hello", "你好spingmvc,最流行的框架之一");

        //视图名

        mv.setViewName("hello");  //相当于:web-inf/jsp/hello.jsp

        returnmv;

    }

    //不需要视图解析器,也可以需要,通过ModelMap来实现ModelMap需要作为处理方法的参数

    @RequestMapping("ModelMap")

    public String ac(String name,ModelMap model){

        model.addAttribute("name", name);

        System.out.println(name);

        return"hello.jsp";     不需要视图解析器的配置,但是配置了,起作用

    }  

5 转发与重定向

//无视图解析器  转发实现1

    public String hello(){

        return"index.jsp";

    }

    //无视图解析器   转发实现2

    public String hello2(){

        return"forward:index.jsp";

    }

    //重定向

    public String hello03(){

        return"redirect:index.jsp";

    }

   

    //通过springmvc来实现转发和重定向          有视图解析器

    //转发

    public String hello04(){

        return"hello";    //转发利用视图解析器直接补充前后缀

    }

    //重定向

    public String hello05(){

        return"redirect:index.jsp";    //注意重定向是不需要视图解析器的

    }

 

提交表单数据,controler获取

/*

     * 获取单个数据时候,直接定义一个相同类型的变量,并且变量名相同,

     * (也可以变量名字不相同,springmvc提供了这种机制,但是自己不要和自己过不去,没任何意义)

     * 然后将数据写到方法的参数里面,注意不需要提供参数名的get,set方法,即可获取

     * 如若传递过来的是多个数据,那就可以创建一个对象,然后将多个数据变为对象的属性,并且提供get set方法,

     * (对象一定得提供get,set方法)

     * 注意:在struts2当中,表单元素为对象的属性时,name属性必须为对象.属性

* 而在springmvc当中,name值直接为属性名字,不需要.啥的

     *

     */

    @RequestMapping("/aaa")

    public String AAA(User user){  //User为一个对象

        System.out.println(user);

        return"redirect:aaa.jsp";

    }

 

package com.springmvc;

 

publicclass User {

 

    private String name;

    privateintage;

    private String address;

    public String getName() {

        returnname;

    }

    publicvoid setName(String name) {

        this.name = name;

    }

    publicint getAge() {

        returnage;

    }

    publicvoid setAge(intage) {

        this.age = age;

    }

    public String getAddress() {

        returnaddress;

    }

    publicvoid setAddress(String address) {

        this.address = address;

    }

    @Override

    public String toString() {

        return"User [name=" + name + ", age=" + age + ", address=" + address + "]";

    }

   

}

 

 

                                    文件的上传

1、        导入相关的jar包

2.    配置相关的文件,在web.xml指定的springmvc.xml文件中进行相应的配置

 <bean id="multipartResolver" 

        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <!-- 设置编码格式 --> 

        <property name="defaultEncoding" value="utf-8"></property>

        <!-- 设置文件大小 --> 

        <property name="maxUploadSize" value="10485760000"></property>

        <!-- 设置缓冲区大小 --> 

        <property name="maxInMemorySize" value="40960"></property> 

    </bean>

Controler代码

//文件的上传

    @RequestMapping("/upload")

    public String upload(@RequestParam("file")CommonsMultipartFile file,HttpServletRequest req){

        //获取文件名

        //file.getOriginalFilename();

        //获取文件上传的路径

        System.out.println("开始上传文件");

        String path = req.getRealPath("/fileupload");

        //获取文件的输入流

        String filename=file.getOriginalFilename();

        InputStream is = null;

        OutputStream ous = null;

        longa = System.currentTimeMillis();

            try {

                is = file.getInputStream();

                ous = new FileOutputStream(new File(path,filename));

                intlen = 0;

                byte[] b = newbyte[400];

                while((len=is.read(b))!=-1){

                    ous.write(b,0,len);

                    System.out.println(b);

                }

            } catch (FileNotFoundException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }finally{

                try {

                    ous.close();

                    is.close();

                } catch (IOException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

            longb = System.currentTimeMillis();

            System.out.println("文件上传完毕,用时"+(b-a));

        return"aaa";

    }

文件的批量上传

//文件的批量上传

        @RequestMapping("/bupload")

        public String upload1(@RequestParam("file")CommonsMultipartFile file[],HttpServletRequest req){

            //获取文件名

            //file.getOriginalFilename();

            //获取文件上传的路径

            for(inti=0;i<file.length;i++){

            System.out.println("开始上传文件");

            String path = req.getRealPath("/fileupload");

            //获取文件的输入流

            String filename=file[i].getOriginalFilename();

            InputStream is = null;

            OutputStream ous = null;

            longa = System.currentTimeMillis();

                try {

                    is = file[i].getInputStream();

                    ous = new FileOutputStream(new File(path,filename));

                    intlen = 0;

                    byte[] b = newbyte[400];

                    while((len=is.read(b))!=-1){

                        ous.write(b,0,len);

                        System.out.println(b);

                    }

                } catch (FileNotFoundException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                } catch (IOException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }finally{

                    try {

                        ous.close();

                        is.close();

                    } catch (IOException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }

                }

                longb = System.currentTimeMillis();

                System.out.println("文件上传完毕,用时"+(b-a));

            }

            return"aaa";

        }

文件的指定路径

Jsp页面

<form action="bupload.do" enctype="multipart/form-data" method="post">

    文件1:<input type="file" name="file"/><br/>

    文件2:<input type="file" name="file"/><br/>

    <input type="submit" value="上传"/><br/>

  </form>

</body>

 

Sprringmvc中处理json

1.使用HttpServletResponse来处理,一般不需要视图解析器

@RequestMapping("/ajax")

    publicvoid ajax(String name,HttpServletResponse resp) throws IOException{

        if("siggy".equals(name)){

            resp.getWriter().print("true");

        }else{

            resp.getWriter().print("false");

        }

       

    }

 采用jquey框架

<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>

<script type="text/javascript">

$(function () {

    $("#textname").blur(function () {

        $.post("ajax.do",{'name':$("#textname").val()},function(data){

           

            alert(data);

        });

       

    });

})

2,springmvc处理json数据

a,导入相关jar包

b,配置json转换器

<!-- 用于将对象转换为 JSON  --> 

    <bean id="stringConverter" 

        class="org.springframework.http.converter.StringHttpMessageConverter"> 

        <property name="supportedMediaTypes"> 

            <list> 

                <value>text/plain;charset=UTF-8</value> 

            </list> 

        </property> 

    </bean> 

    <bean id="jsonConverter" 

        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> 

  

    <bean 

        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 

        <property name="messageConverters"> 

            <list> 

                <ref bean="stringConverter" /> 

                <ref bean="jsonConverter" /> 

            </list> 

        </property> 

    </bean>  

c.controler代码

@RequestMapping("/json")

    @ResponseBody

    public List<User> user(){

        List<User> list = new ArrayList<User>();

        list.add(new User(1,"张三",""));

        list.add(new User(2,"李四",""));

        list.add(new User(3,"王五",""));

        returnlist;

    }

 

$(function () {

    $("#textname").click(function () {

        $.post("json.do",function(data){

            var html="";

            for(var i=0;i<data.length;i++){

                html+="<tr><td>"+data[i].id+"</td><td>"+data[i].name+"</td><td>"+data[i].sex+"</td></tr>";

            }

            $("#container").html(html);

        });

       

    });

})

 

<input type="button"  id="textname" value="获取数据"/>

<table width="80%" align="center">

<tr>

<td>编号</td>

<td>姓名</td>

<td>性别</td>

 

</tr>

<tbody id="container">

 

拦截器

1   不需要jar包

2   头文件的配置

<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"

    xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

 

<mvc:interceptors>

    <!-- mvc:interceptors中可以配置多个拦截器

        多个拦截器按顺序一一执行

    -->

        <mvc:interceptor>

            <!-- 指明哪些请求需要被拦截

                /login.do 表示login.do需要被拦截

                /user/add.do 表示/user/add.do请求要被拦截

                /* 表示项目路径下的所有请求被拦截

                    可以拦截: /login.do  /add.do  /user.do /sys.do

                /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截

                    可以拦截: /login.do  /add.do  /user.do /sys.do

                    /user/add.do

             -->

            <mvc:mapping path="/**"/>

            <!-- 指定拦截器的位置 -->

            <bean class="com.springmvc.SpringMvc"></bean>

        </mvc:interceptor>

 

3  拦截代码   实现一个接口

package com.springmvc;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

public class SpringMvc implements HandlerInterceptor{

 

         //请求处理的方法之前进行执行

         //如果返回为true,那么执行下一个拦截器,如果返回false那么不执行下一个拦截器

         @Override

         public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

                   // TODO Auto-generated method stub

                   System.out.println("-----------处理之前---------------");

                   return true;

         }

        

         //请求方法处理之后执行

         @Override

         public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

                            throws Exception {

                   System.out.println("----------------处理之后----------------");

         }

        

         //在DispatcherServlet处理后执行          清理工作

         @Override

         public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

                            throws Exception {

                   // TODO Auto-generated method stub

                  

         }

}

登录拦截案列

1  配置以及拦截的对象

<mvc:interceptor>

            <!-- 指明哪些请求需要被拦截

                /login.do 表示login.do需要被拦截

                /user/add.do 表示/user/add.do请求要被拦截

                /* 表示项目路径下的所有请求被拦截

                    可以拦截: /login.do  /add.do  /user.do /sys.do

                /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截

                    可以拦截: /login.do  /add.do  /user.do /sys.do

                    /user/add.do

             -->

             <!-- 拦截所有 -->

            <mvc:mapping path="/**"/>

            <!-- 指定拦截器的位置 -->

            <bean class="com.springmvc.LoginIntereceptor">

            <!-- 类似于struts2注入参数 -->

                <property name="allowedPass">

                    <list>

                    <!-- 允许通过的url -->

                    <value>login.do</value>

                    </list>

                </property>

            </bean>

        </mvc:interceptor>

2  登录验证

@RequestMapping("/login")

    public String login(User user,HttpSession session){

        System.out.println(user);

        if("username".equals(user.getName())&&"123".equals(user.getPassword())){

        session.setAttribute("user", user);

            return"redirect:/success.jsp";

        }

        //密码错误,重定向到login.jsp

        return"redirect:/login.jsp";

    }

    @RequestMapping("/aaa")

    public String login01(User user,HttpSession session){

       

        //密码错误,重定向到login.jsp

        return"redirect:/aaa.jsp";

    }

3  拦截器代码

//哪些url不被拦截

    private List<String> allowedPass;

    publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

        System.out.println("进入拦截器");

        //先判断session中是否有

        Object user = request.getSession().getAttribute("user");

        if(user!=null){

            returntrue;

        }

        String url = request.getRequestURI().toString();

        System.out.println(url);

        //获取拦截器当中注入的每个参数值,然后进行判断,如果某个符合,直接返回true,进行下一步

        for(String temp:allowedPass){

            System.out.println(temp);

            if(url.endsWith(temp)){

                returntrue;

            }

        }

       

        returnfalse;

    }

 

    @Override

    publicvoid afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

            throws Exception {

        // TODO Auto-generated method stub

       

    }

 

    @Override

    publicvoid postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

            throws Exception {

        // TODO Auto-generated method stub

       

    }

    publicvoid setAllowedPass(List<String> allowedPass) {

        this.allowedPass = allowedPass;

    }

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值