SpringMVC编程<三>

SpringMVC编程<三>

@Controller注解的应用演示

演示接参数:

所有要用的核心类和配置文件先都写好,因为昨天测试了2个配置文件,优先读默认的hncu-servlet.xml所以,今天以默认为例:(所有演示结果都是输出到控制台)
直接用超链接的形式调用函数,还是以’sp/’拦截
这里写图片描述
演示代码:

@Controller
public class DemoController implements ServletContextAware {
// 演示接受页面上传的参数
    @RequestMapping(value = "/two")
    // 变量名与前端提交的参数名一样
    public String two(String name, Integer age) {
        System.out.println(name + "," + age);
        return "hncu";
    }

    // GET方式提交
    @RequestMapping(value = "/three")
    // 变量名与前端提交的参数名 如果不同
    public String three(@RequestParam("name") String nm,
            @RequestParam("age") Integer ag) {
        // 参数加注解
        System.out.println(nm + "," + ag);
        return "hncu";
    }
    }

如果需要改变提交方式:

// POST
    @RequestMapping(value = "/four", method = { RequestMethod.POST })
    // 改变提交方式
    public String four(@RequestParam("name") String nm,
            @RequestParam("age") Integer ag) {
        // 参数加注解
        System.out.println(nm + "," + ag);
        return "hncu";
    }

这里写图片描述

如果需要限定参数,例如必须填,或者不填:

// 限制某参数必填,必须提交参数'age=',至于值是多少不管
    @RequestMapping(value = "/s1", method = { RequestMethod.POST })
    // 改变提交方式
    public String s1(@RequestParam(name = "name", required = true) String nm,
            @RequestParam(name = "age") Integer ag) {
        // 参数加注解
        System.out.println(nm + "," + ag);
        return "hncu";
    }

这里写图片描述

也可以直接在请求路径URL中给参数:

// 演示从URL路径中提取参数
    @RequestMapping(value = "/s2/{name}/{age}")
    public String s2(@PathVariable("name") String nm,
            @PathVariable("age") Integer ag) {
        // 参数加注解
        System.out.println(nm + "," + ag);
        return "hncu";
        // http://127.0.0.1:8080/springmvcDemo2/sp/s2/Rose/30
    }

这里写图片描述

还可以限制请求头:

// 演示请求头的限定 ↓
    @RequestMapping(value = "/s3", params = { "name", "!age" }, headers = { "referer=http://127.0.0.1:8080/springmvcDemo2/" })
    // 限定提交的参数必须包含name,不包含age,防盗链(限定请求必须包含某key的参数)
    public String s3() {
        System.out.println("OK!");
        return "hncu";
    }

这里写图片描述

可以将servlet的req,resp拿到作为参数:

// 演示注入原装的request,response
    @RequestMapping(value = "/s4")
    public ModelAndView s4(HttpServletRequest req, HttpServletResponse resp) {
        // 要什么功能拿就有
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("hncu2");
        mv.addObject("name", name);
        mv.addObject("age", age);
        return mv;
    }

这里写图片描述

它会自动封装javabean:

// 演示自动封装参数到JavaBean(级联的都可以)
    @RequestMapping(value = "/s5")
    public String s5(User user) {
        System.out.println("user:" + user);
        return "hncu2";
    }

这里写图片描述

使用的javabean:
加上SET,GET,ToString
这里写图片描述

这里写图片描述

也可以用PUT来提交

// 演示请求方式是PUT方式,顺带演示从请求地址和表单接受参数
    @RequestMapping(value = "/s6/{name1}", method = { RequestMethod.PUT })
    public String s6(@PathVariable("name1") String name1,
            @RequestParam("name2") String name2) {
        System.out.println(name1 + "," + name2);
        return "hncu2";
    }

这里写图片描述

演示可以注入其他数据,例如session:

//该类实现
// 演示绑定(注入)其他数据 如session,请求头中的信息
    @RequestMapping(value = "/s7")
    public String s7(HttpSession session,
            @RequestHeader("accept") String accept,
            @CookieValue("JSESSIONID") String sessionId, User user) {
        System.out.println("session" + session + "<br/>");
        System.out.println("accept" + accept + "<br/>");
        System.out.println("JSESSIONID" + sessionId + "<br/>");
        System.out.println("User" + user + "<br/>");
        return "hncu2";
    }

还有数组,集合类型:

// 绑定数组,集合等类型的请求参数
    @RequestMapping(value = "/s8")
    public String s8(@RequestParam("h") String[] hobbys,
            @RequestParam("ss") List<String> ss) {
        // http://127.0.0.1:8080/springmvcDemo2/sp/s8?h=music&h=game&h=sport&ss=aa&ss=bb
        // System.out.println("hobbys:"+hobbys);地址
        for (String str : hobbys) {
            System.out.println("hobbys:" + str);
        }
        System.out.println("ss" + ss);
        return "hncu2";
    }

这里写图片描述

还有servlet原生API接口:

// 演示绑定Servlet原声API类的接口,WebRequest
    @RequestMapping(value = "/s9")
    public String s9(WebRequest req) {
        System.out.println("req" + req);
        return "hncu2";
    }

利用文件下载工具类实现文件下载与文件上传

先导包:
这里写图片描述

文件下载演示:

// 文件下载//
    @RequestMapping(value = "/f1")
    public void f1(OutputStream out, HttpSession s, HttpServletRequest req,
            HttpServletResponse resp) {
        String path = s.getServletContext().getRealPath("/up/a.doc");
        // 设置为下载类型
        resp.setContentType("application/force-download");
        resp.setHeader("Content-Disposition", "attachment;filename=a.doc");
        // 2.5版本2个包commons-io和commons-fileupload
        try {
            InputStream in = new FileInputStream(path);
            // 使用文件上传包中拷贝流工具,把字节流数据发送给客户端(out)
            Streams.copy(in, out, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

文件上传

单文件

// 单文件版
    @RequestMapping(value = "/f2")
    // 要求必须上传file
    public String f2(@RequestParam("file") MultipartFile file) {
        // 配置文件hncu-servlet.xml的multipartResolver
        /*
         * 本地路径(也可以和f1方法一样用session) ---这里以 获取ServletContext的方式来得到磁盘路径
         * 当前类需要实现ServletContextAware
         */
        String path = ctx.getRealPath("/up");
        try {
            Streams.copy(file.getInputStream(), new FileOutputStream(path + "/"
                    + file.getOriginalFilename()), true);
            System.out.println("文件上传成功...");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "hncu3";
    }

    private ServletContext ctx = null;
    //拿容器
    @Override
    public void setServletContext(ServletContext ctx) {
        this.ctx = ctx;

    }

这里写图片描述

多文件

//多文件版
    @RequestMapping(value = "/f3")
    // 要求必须上传file
    public String f3(@RequestParam("file") List<MultipartFile> files) throws Exception {

        if (files!=null) {
            String path = ctx.getRealPath("/up");
            for(MultipartFile file : files){
                if(file!=null && !file.isEmpty()){ //非空
                    Streams.copy(file.getInputStream(), new FileOutputStream(path + "/"
                            + file.getOriginalFilename()), true);
                }
            }
        }
        return "hncu3";
    }

这里写图片描述

演示SpringMVC与Service层的整合

现在stud中将架构搭好:

这里写图片描述

利用注解将dao,service注入:

首先在DAO的实现类加一个注解:
这里写图片描述
在要注入的地方加个注解:

这里写图片描述

这里写图片描述
演示:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是用SpringMVC框架实现图片文件上传的步骤: 1. 在pom.xml文件中加入以下依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.10</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> ``` 2. 在spring配置文件中加入以下配置: ```xml <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="5242880" /> </bean> ``` 其中,maxUploadSize属性是上传文件的最大大小,单位为字节。上面的配置表示最大上传5MB的文件。 3. 在Controller中添加以下方法: ```java @RequestMapping(value = "/upload", method = RequestMethod.POST) public String upload(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { String fileName = file.getOriginalFilename(); String filePath = "D:/upload/" + fileName; File dest = new File(filePath); file.transferTo(dest); return "上传成功"; } catch (Exception e) { e.printStackTrace(); return "上传失败"; } } else { return "文件为空"; } } ``` 其中,@RequestParam注解表示获取上传的文件,MultipartFile类型表示文件类型。 4. 在JSP页面中添加以下代码: ```jsp <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="上传" /> </form> ``` 其中,enctype属性表示表单数据的编码类型,必须设置为multipart/form-data,才能支持文件上传。 以上就是用SpringMVC框架实现图片文件上传的完整步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值