学习笔记-----springMVC入门 (二)

本文详细介绍了SpringMVC注解模式的配置方法及使用技巧,包括控制器配置、参数绑定、视图返回、文件上传等功能,并展示了如何利用注解简化开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springMVC注解模式:

    注解模式示例:配置文件:

    <?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:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                http://www.springframework.org/schema/mvc
                http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-3.2.xsd ">

        <!-- 注解驱动:声明使用注解的方式。 -->
        <mvc:annotation-driven/>
        
        <!-- 类扫描机制,定义扫描的范围 -->
        <context:component-scan base-package="cn.itcast.springmvc.web.controller"></context:component-scan>
        
        <!-- 内部资源视图解析器 -->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            
            <!--前缀 ,  value中设置值,设置为/时默认是从根目录开始寻找-->
            <property name="prefix" value="/"></property>
            <!--后缀  -->
            <property name="suffix" value= ".jsp"></property>
        </bean>
        
        

    </beans>



    配置好了之后书写Controller类:
    
    package cn.itcast.springmvc.web.controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;


    @Controller
    public class HomeController {
        
        //此注解用于标注访问的时的uri,当配置为/时,必须在工程名后跟.action即什么都输入,只输入.action,这样拦截机制才会起作用。
        @RequestMapping(value = { "/", "/home.action" })
        public String goHome() {
            System.out.println("Brave new world!");

            return "index";
        }
    }

        

    通过上面的例子可以得出以下内容,书写的类型与struts2基本相似,学习过struts2后使用此方法很方便, 但是在该方法内没有看到参数,
    也没有返回ModelandView吗?事实上不是这样的,在goHome方法中,当需要时,可以将你需要的参数放入到方法的参数内,即括号中,
    springMVC会自动帮你将将相应的参数传入,只是上例没有而已。当需要request的时候写上request,当需要页面传递进来的beanid时写上beanID即可。


    


    示例:第一种将数据返回给页面的方法
        cn.itcast.springmvc.controller. PersonController 控制类

        @Controller
        public class PersonController {

            @Resource
            private PersonService ps;
            
            @RequestMapping(value={"/person/list"})
            
            //需要在页面回显数据时,直接新建一个map,  参数名为model,将要显示的数据放入到该model中即可。
            public String list(Map<String,Object> model){        //BindingAwareModelMap
                System.out.println("all");
                List<Person> list = ps.list();
                model.put("personList", list);
                
                return “jPersonList";
            }
        }



    示例:第二种将数据返回给页面的方法:
        cn.itcast.springmvc.controller. PersonController 控制类

        @Controller
        public class PersonController {

            @Resource
            private PersonService ps;
            
            @RequestMapping(value={"/person/list"})
            
            //这里需要注意的model在addAttribute时,并没有指定参数的key值,所以在页面中应该如何的取出呢?
            //springMVC默认的处理机制是,当存入的参数是一个容器的时候,容器中存放的是持久化类,然后根据
            //持久化类的类名转小写,然后拼接上一个list,在页面中:${personList.id}即可调用。
            public String list(Model model){        //BindingAwareModelMap
                System.out.println("all");
                List<Person> list = ps.list();
                model.addAttribute("personList", list);
                
                return “jPersonList";
            }
        }


    无论上面两个那种方法,都是继承了BindingAwareModelMap,采用其中的机制。


    当使用return "redirect:/person/list.action";  相当于就是重定向到了另一个 action方法。




    在类上注解使用 @RequestMapping(value={"/person"}),则在下面的方法中无需在重复的输入/person,springMVC会自动负责拼装。


在实际的业务中,为了区分,通常将配置bean的文件与配置Controller的配置文件分开,这样的话则需要在web.xml中重新配置,配置方法如下:
    
    在web.xml中增加配置:
    
    <!-- 通过上下文参数指定分解的上下文配置参数 -->
    <context-param>
        
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:beans.xml</param-value>

    </context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>




    当做增删改查操作时,如果传的参数和PO对象字段不同呢?怎么做?
    解决方案:public String delete(@RequestParam("delId") Integer id)其中的requestparam(“delid”)就是页面上的字段名称,

    当在参数中使用此标签时,springMVC会自动进行相互转换。也就是说注解也是可以写在参数中的^ ^.





springMVC实现文件上传示例:

    配置文件上传解析器等:

    <?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:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                http://www.springframework.org/schema/mvc
                http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-3.2.xsd ">

        <!-- 注解驱动方式 -->
        <mvc:annotation-driven/>    
        
        <!-- 自动扫描 -->
        <context:component-scan base-package="cn.itcast.springmvc.web.controller"/>
        
        <!-- 静态资源进行管理 -->
        <mvc:resources location="/resources/" mapping="/resources/**"/>
        <mvc:resources location="/upload/" mapping="/upload/**"/>
        
        <!-- 文件上传解析器  上传最大尺寸:10M(10485760)、id名称必须为:multipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="10485760"/>
        </bean>
        
        <!-- 内部资源视图解析器 (前缀+逻辑名+后缀) -->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/jsps/"/>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>
        
        
    </beans>




    java代码:
    
    @RequestMapping("/saveOrUpdate.action")
    public String saveOrUpdate(
            @Valid Person p, BindingResult br,
            MultipartFile photo,
            HttpServletRequest request
    ) throws IOException{
        /**
         * 步骤:
         * 1、得到文件
         * 2、保存文件到服务上
         * 3、设置记录对应的图片位置
         */
        
        //校验出错
        if(br.hasErrors()){
            if(p.getId()==null){
                return "person/jPersonCreate";
            }else{
                return "person/jPersonUpdate";
            }
        }
        
        if(!photo.isEmpty()){
            ServletContext sc = request.getSession().getServletContext();
            String dir = sc.getRealPath("/upload/");            //得到服务器真实路径
            String filename = photo.getOriginalFilename();        //得到上传时的文件名
            String _extName = filename.substring(filename.indexOf("."));    //扩展名
            
    //        filename = UUID.randomUUID().toString() + _extName;                //图片名称定义为UUID,防止并发文件被覆盖的情况
    //        filename = System.nanoTime() + _extName;                        //nanoTime数值
            filename = System.currentTimeMillis() + _extName;            //currentTimeMillis数值
            
            FileUtils.writeByteArrayToFile(new File(dir+"/"+filename), photo.getBytes());    //写文件到服务器上
            
            
            p.setPhotoPath("/upload/" + filename);        //设置图片路径
        }
        
        personService.saveOrUpdate(p);
        
        return "redirect:/person/listAll.action";        //重定向
    }


    从中也可以看到方法需要什么参数,就可以写上什么参数,springMVC会自动为你赋值。


    页面中配置:

        <tr align="center">
            <td>图片:</td>
            <td><input type="file" name="photo"/></td>
        </tr>





校验功能实现 在实体类上添加校验注解

    Person.java中在属性上配置:

    @Size(min=3,max=10,message="用户名必须大于3个字符,小于10个字符")
    private String name;
    
    
    @NotNull(message="年龄不能为空")
    private Integer age;




    在jsp中:personUpdate.jsp
    
    
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>  引入sf:from标签,在页面中配置该标签即可输出信息。
      该标签需要注意的是:from中必须配置modelAttribute="持久化类",否则会报错。

     <sf:form action="${pageContext.request.contextPath}/person/saveOrUpdate.action" modelAttribute="person" enctype="multipart/form-data">


    <tr align="center">
        <td>姓名:</td>
            <td><sf:input path="name"/><sf:errors path="name"/></td>
    </tr>
    
    <tr align="center">
            <td>年龄:</td>
            <td><sf:input path="age"/><sf:errors path="age"/></td>
    
    </tr>



    在java类中:根据上例的java类中的一部分:
    PersonController.java
    public String saveOrUpdate(@Valid Person p, BindingResult br,//此参数就是错误配置
            @RequestParam("photo") MultipartFile file,
            HttpServletRequest request, HttpServletResponse repsonse){
    
        if(br.hasErrors()){
            return “person/jPersonUpdate”;  //此部分配置的为 有错误返回页面显示错误
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值