大数据正式33

大数据正式33

SpringMVC

  • Servlet缺点
    1. 一个Servlet有8行配置文件
    2. 一个Servlet只能处理一个业务
    3. 一张表可能有4+n个Servlet,所以会有32+n行配置文件
    4. 获取属性只能得到字符串类型,需要自己转换类型
    5. 获取参数只能是request.getParameter()
  • SpringMVC优点
    1. 不管工程中有多少servlet,只需要配置一个servlet分发器即可
    2. springmvc中使用controller替代一个controller
    3. 获取参数的类型支持自动装换,而且支持对象的自动封装
    4. SpringMvc有多种获取参数的方式

SprigMVC入门案例

  • jar包
  • 项目结构
  • 整体流程
  • 代码

    • web.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
          <!-- servlet分发器 -->
          <servlet>
              <servlet-name>springmvc</servlet-name>
              <!-- 分发器 -->
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <!-- 注入配置文件的地址:创建spring容器 -->
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:/applicationContext-mvc.xml</param-value>
              </init-param>
          </servlet>
          <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <!-- /或*.action -->
              <url-pattern>*.action</url-pattern>
          </servlet-mapping>
          <welcome-file-list>
              <welcome-file>index.jsp</welcome-file>
          </welcome-file-list>
      </web-app>
      
    • applicationContext-mvc.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd ">
          <!-- 扫描包 -->
          <context:component-scan base-package="com.peng"></context:component-scan>
          <!-- 扫描注解 -->
          <context:annotation-config></context:annotation-config>
      
          <bean name="/hello.action" class="com.peng.controller.HelloController"></bean>
      </beans>
      
    • com.peng.controller

      • HelloController

        package com.peng.controller;
        
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        
        import org.springframework.web.servlet.ModelAndView;
        import org.springframework.web.servlet.mvc.Controller;
        
        public class HelloController implements Controller {
        
            public ModelAndView handleRequest(HttpServletRequest request,
                    HttpServletResponse response) throws Exception {
                ModelAndView modelAndView = new ModelAndView();
                modelAndView.setViewName("index.jsp");
                modelAndView.addObject("msg", "hello");
                return modelAndView;
            }
        }
        
    • index.jsp

      <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
      <%
          String path = request.getContextPath();
          String basePath = request.getScheme() + "://"
                  + request.getServerName() + ":" + request.getServerPort()
                  + path + "/";
      %>
      
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
      <head>
      <base href="<%=basePath%>">
      
      <title>My JSP 'index.jsp' starting page</title>
      <meta http-equiv="pragma" content="no-cache">
      <meta http-equiv="cache-control" content="no-cache">
      <meta http-equiv="expires" content="0">
      <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
      <meta http-equiv="description" content="This is my page">
      <!--
          <link rel="stylesheet" type="text/css" href="styles.css">
          -->
      </head>
      
      <body>
          This is my JSP page.
          <br>
          <h1>${msg}</h1>
      </body>
      </html>
      
  • 访问名称
    • http://localhost/SpringMVC_inroom/hello.action(注:端口为80)
  • 执行结果

注解形式的SpringmMVC

package com.peng.controller;

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

@Controller
public class HelloController {
    @RequestMapping("/hello.action")
    public String helloAction(Model model) {
        model.addAttribute("msg", "hello,world!");
        return "index";
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-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/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd ">
    <!-- 扫描包 -->
    <context:component-scan base-package="com.peng"></context:component-scan>
    <!-- 扫描注解 -->
    <context:annotation-config></context:annotation-config>
    <!-- SpringMVC的注解开关 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 资源解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

添加前后缀的SpringMVC(applicationContext-mvc.xml)

<!-- 资源解析器 -->
<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

解决乱码--过滤器(web.xml)

<!-- 乱码过滤器 -->
    <filter>
        <filter-name>characterFilter</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>characterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

数据的获取

  • HttpServletRequest对象的getParameter方法

    package com.peng.controller;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class UserController {
        @RequestMapping("/showAddUser.action")
        public String showAddUser() {
            return "addUser";
        }
    
        @RequestMapping("/addUser.action")
        public String addUser(HttpServletRequest request, Model model) {
            String username = request.getParameter("username");
            System.out.println(username);
            model.addAttribute("username", username);
            return "addUser";
        }
    }
    
  • 与表单的name值一样的参数String username

    • 参数名来控制

      package com.peng.controller;
      
      import javax.servlet.http.HttpServletRequest;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      @Controller
      public class UserController {
          @RequestMapping("/showAddUser.action")
          public String showAddUser() {
              return "addUser";
          }
      
          @RequestMapping("/addUser.action")
          public String addUser(String username, Model model) {
              System.out.println(username);
              model.addAttribute("username", username);
              return "addUser";
          }
      }
      
  • bean对象 User

    • 参数名来控制

      package com.peng.controller;
      
      import javax.servlet.http.HttpServletRequest;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      @Controller
      public class UserController {
          @RequestMapping("/showAddUser.action")
          public String showAddUser() {
              return "addUser";
          }
      
          @RequestMapping("/addUser.action")
          public String addUser(User user, Model model) {
              System.out.println(user.username);
              model.addAttribute("username", user.username);
              return "addUser";
          }
      }
      
  • 对象中的对象

    • 参数名来控制

      • dog.name
      • gog.age

        class Dog{
            private String name;
        
            public void setName(String name){
                this.name=name;
            }
        
            public String getName(){
                return this.name;
            }
        }
        

        class User{
            private dog;
        
            public void setDog(Dog dog{
                this.dog=dog;
            }
        
            public Dog getDog(){
                return this.dog;
            }
        }
        

        package com.peng.controller;
        
        import javax.servlet.http.HttpServletRequest;
        
        import org.springframework.stereotype.Controller;
        import org.springframework.ui.Model;
        import org.springframework.web.bind.annotation.RequestMapping;
        
        @Controller
        public class UserController {
            @RequestMapping("/showAddUser.action")
            public String showAddUser() {
                return "addUser";
            }
        
            @RequestMapping("/addUser.action")
            public String addUser(String username, Model model) {
                System.out.println(user.dog.name);
                model.addAttribute("username", user.dog.name);
                return "addUser";
            }
        }
        

日期问题

  • 格式问题

    2017/12/25这个错误;
    2017-12-25这个可以;
    
  • 解决(Controller中)

    @InitBinder
        public void InitBinder(ServletRequestDataBinder srdb) {
            srdb.registerCustomEditor(java.util.Date.class, new CustomDateEditor(
                    new SimpleDateFormat("yyyy-MM-dd"), true));
        }   
    

参数的同名提交

  • String

    a,b,c
    
  • 例子

    @RequestMapping("/addUser.action")
    public String addUser(
            HttpServletRequest request,
            Model model,
            Date date,
            String like) {
        String username = request.getParameter("username");
        System.out.println(username + date.toString() + like);
        model.addAttribute("username", username);
        return "addUser";
    }
    
  • String[]

    {a,b,c}数组形式
    
  • 例子

    @RequestMapping("/addUser.action")
    public String addUser(
            HttpServletRequest request,
            Model model,
            Date date,
            String[] like) {
        String username = request.getParameter("username");
        System.out.println(username + date.toString() + Arrays.toString(like));
        model.addAttribute("username", username);
        return "addUser";
    }
    

参数名称不一致的问题

  • 问题呈现
    • form表单提交过来的name和参数中的name值不相同时--因为要见名知义,稍微改动了参数的名称
  • @RequestParam("hobby")String[] hobbies
  • @RequestParam
    • value--对应form中的name值
    • defaultValue--默认的值
    • require--必须传过来时有参数
  • 例子

    @RequestMapping("/addUser.action")
    public String addUser(
            HttpServletRequest request,
            Model model,
            Date date,
            @RequestParam(value = "like", defaultValue = "啥也不喜欢!") String[] likes) {
        String username = request.getParameter("username");
        System.out.println(username + date.toString() + Arrays.toString(likes));
        model.addAttribute("username", username);
        return "addUser";
    }
    

文件上传

  • 注意的坑
    1. form中的参数
      1. method:post
      2. enctype:multipart/form-data
    2. file文件标签
      1. 必须有name属性
    3. 文件解析器
      1. 必须有id属性
      2. id属性的值必须是:multipartResolver
  • 改三个地方

    1. jsp中

      <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
      <!DOCTYPE HTML >
      <html>
      <head>
      <title>Add User</title>
      </head>
      
      <body bgcolor="#0000ff" text="#ffffff">
          <form action="addUser.action" method="POST"
              enctype="multipart/form-data">
              <table border="1">
                  <tr>
                      <td>用户名:</td>
                      <td><input type="text" name="username" />
                      </td>
                  </tr>
                  <tr>
                      <td>时间:</td>
                      <td><input type="date" name="date" />
                      </td>
                  </tr>
                  <tr>
                      <td>上传文件:</td>
                      <td><input type="file" name="file" />
                      </td>
                  </tr>
                  <tr>
                      <td>爱好:</td>
                      <td>篮球<input type="checkbox" name="like" value="basketball" />
                          足球<input type="checkbox" name="like" value="football" /> 乒乓球<input
                          type="checkbox" name="like" value="pingpangball" />
                  </tr>
                  <tr>
                      <td>提交:</td>
                      <td><input type="submit" value="确认" />
                      </td>
                  </tr>
              </table>
          </form>
      </body>
      </html>
      
    2. 解析器(必须有id和class)

      <!-- 文件上传解析器 -->
          <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>
      
    3. 后台

      package com.peng.controller;
      
      import java.io.File;
      import java.io.IOException;
      import java.text.SimpleDateFormat;
      
      import org.apache.commons.io.FileUtils;
      import org.springframework.beans.propertyeditors.CustomDateEditor;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.ServletRequestDataBinder;
      import org.springframework.web.bind.annotation.InitBinder;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.multipart.MultipartFile;
      
      @Controller
      public class UserController {
          @RequestMapping("/showAddUser.action")
          public String showAddUser() {
              return "addUser";
          }
      
          @RequestMapping("/addUser.action")
          public String addUser(@RequestParam MultipartFile file) throws IOException {
              FileUtils.writeByteArrayToFile(new File(
                      "C:\\Users\\Administrator.PC-20160710IJPJ\\Desktop\\haha.png"),
                      file.getBytes());
              System.out.println(file.toString());
              return "addUser";
          }
      
          @InitBinder
          public void InitBinder(ServletRequestDataBinder srdb) {
              srdb.registerCustomEditor(java.util.Date.class, new CustomDateEditor(
                      new SimpleDateFormat("yyyy-MM-dd"), true));
          }
      }
      

请求和重定向

  • 默认是转发
  • 重定向--不能直接写界面,尤其是WEB-INF下的界面

    return "redirect:请求"
    return "redirect:addUser.action"
    

补充

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘风御浪云帆之上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值