hsipeng / java_learnning_trip

spring springMVC mybatis
0 stars 1 forks source link

Spring-MVC #42

Open hsipeng opened 7 years ago

hsipeng commented 7 years ago

SpringMVC是一个前端控制框架,将代替传统的Servlet服务。SpringMVC是Spring的一大组件。

Servlet的缺点

hsipeng commented 7 years ago

注意事项

入门案列

hsipeng commented 7 years ago

核心配置文件位置

<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 修改配置文件位置 -->
        <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
    </servlet>

springMVC的注解

<mvc:annotation-driven/>
<context:component-scan base-package="controller"></context:component-scan>

获取request和response对象

RequestMapping(value="/say.action")
    public String say(HttpServletRequest request,HttpServletResponse response) throws Exception{
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("name");
        System.out.println(name);
        return "hello";
    }

或者

@RequestMapping(value="/addName.action")
    public String addName(String name){
        System.out.println(name);
        return "hello";
    }
hsipeng commented 7 years ago

解决中文乱码

web.xml

<!--解决中文乱码-->
    <filter>
        <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
hsipeng commented 7 years ago

对象的封装

对象属性和页面传过来的属性值应保持一致,并且setter,getter方法不能省略,否则不能正确注入

对象的引用封装参数

  解决方案:自定义日期
@RequestMapping(value="/addUser.action")
    public String addUser(Model model,User user){
        System.out.println(user);
        String msg ="添加完成";
        model.addAttribute("msg",msg);
        return "hello";
    }
    //日期格式转换
    @InitBinder
    public void IntiBonder(ServletRequestDataBinder binder){
        binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));

    }

上述的initbinder,可以在任意controller类中实现格式的转化。 通常放在基本类中,别的类继承即可。

同名提交问题

如果遇到同名提交,那么如果接受参数为String类型,会吧用户提交的信息拼接成一个字符串,乳沟接受的参数为数组时,那么SpringMVC将会把同名提交自动赋值到数组中

转发和重定向

跳转


@RequestMapping(value="/toUser.action")
public String toUser(){
return "user";
}

### 转发
- 浏览器地址不会改变
- 能携带参数
 forward:/toUser.action

//转发到用户注册页面 @RequestMapping(value="/helloForWard.action") public String Forward(){ System.out.println("实现转发"); return "forward:/toUser.action"; }


### 重定向
- 浏览器地址改变
- 不能携带参数

//重定向到用户注册页面 @RequestMapping(value="/helloRedirect.action") public String Redirect(){ System.out.println("实现重定向"); return "redirect:/toUser.action"; }


## 页面中name属性的值和参数名称不匹配
  其他属性值的用法

@RequestMapping(value="/addUser.action") public String addUser(Model model,User user,@RequestParam(value="state",required=true,defaultValue="null") String state){ System.out.println(user); System.out.println(state); String msg ="添加完成"; model.addAttribute("msg",msg); return "hello"; }


- value 页面中的name属性值
- required true,表示必须传递该参数,false,可以不传
- defaultvalue 表示为null时,会添加默认值

## 页面路径问题
 页面原来放置在webRoot文件夹下,那么浏览器可以直接通过url访问,不安全,所以放在web-inf文件夹下。
hsipeng commented 7 years ago

spring文件上传

spring.xml

<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="5242880"/>
</bean>
hsipeng commented 7 years ago

RestFul

传统 say.action?name=a&age=1

理想模式

只传值不传参数名

RestFul格式 say/a/1.action