springmvc中数据绑定,controler开发细节,以及与struts2对比

springmvc和struts2的本质区别(以下为我抄的):
struts2:通过在action类中设置成员变量接收参数,所以struts2必须使用多例。

springmvc:请求数据,通过参数绑定,将参数赋值给controller的方法形参。springmvc可以单例也可以多例,建议使用单例。

1、springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
2、springmvc是基于方法开发(一个url对应一个方法,通过处理器映射器将url对象的method封装成一个HandlerMethod对象),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
3、Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

Struts的问题:
Struts的漏洞比较多,12年的那次安全漏洞,波及了好多国内好多网站,造成了很大的损失,而且官方竟然直接演示攻击方法,也是醉了。
struts的标签的性能不好,建议使用jstl。
struts2漏洞问题所在:,
可远程执行服务器脚本代码
用户可以构造
http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,’goes’,’here’})).start()}链接,command goes here可以换成是破坏脚本的路径和参数,比如fdisk -f等,造成破环系统无法运行的目的。
重定向漏洞[3]
用户可以构造如知名网站淘宝的重定向连接,形如打折新款,引导用户点击后进入钓鱼网站,在界面上让其进行登陆用以获取用户的密码。

简单介绍下springmvc中controler开发的几种数据绑定方式

1:基本数据类型绑定

表单:

  基本参数绑定
  
"${pageContext.request.contextPath }/student/searchById.action" method="post" > id:type="text" name="sid" >
type="submit" value="提交">

controler中直接使用表单中字段作为参数,就可以接受到,表单传递过来的值,但是一定要保证名称一致,不一致可以使用注解requestparam来指定绑定的参数,

controler中对应的方法:

/*  springmvc的参数绑定,既可以使用上面的继承controler接口接收request和response对象,使用传统操作来实现url参数获取
    也可以不实现controler接口,直接在方法参数接收参数
    基本参数绑定可以参数名字成一定要一致
    如果不一致,可以使用注解,
    */
    @RequestMapping(value="searchById.action")
    //例如这里的form表单是sid方法参数是id使用@RequestParam注解来说明和那个参数绑定
    public ModelAndView select(@RequestParam(name="sid")Integer id){
        //service查找
        Student stu=studentService.selectStudent(id);
        //生成返回model
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("student",stu);
        modelAndView.setViewName("show");
        return modelAndView;
    }

2:po类数据类型绑定

表单

po类参数绑定:

  <form action="${pageContext.request.contextPath }/student/updateStudent.action" method="post" >
  sid:<input type="text" name="sid" ><br/>
    name:<input type="text" name="name" ><br/>
      age:<input type="text" name="age" ><br/>
  <input type="submit" value="提交">
  form>

controler中对应的方法:

    /**
     * @param model
     * @param student
     * 也可以直接使方法的形参为model,然后返回视图名即可
     * 接收po类时注意表单中的名称一定要和po类中的属性一致
     * 一般修改数据都是先查询再修改,这里只做演示,所以省略,只做修改
     * 另外在介绍下requestMapping用法:
     * value用户指定url
     * method:用于指定访问方法时get还是post,默认两者都可以
     * method=RequestMethod.POST
     * @return
     */
    @RequestMapping(value="updateStudent.action")
    public String updateStudent( Model model,Student student){
        //执行修改
        studentService.update(student);
        //通过model向页面传递数据,不用返回,会自动放到request域中
        model.addAttribute("msg","model测试");

        /*
         * 返回视图名,
         * 1:也可以重定向地址
         * 格式是:redirect:重定向地址(可以是http://.....)
         * 如:redirect:http://www.baidu.com
特点:浏览器地址栏会变化,因为重新发起新的request
controller的重定向原方法和controller重定向目标方法参数是不能共享,因为reqeust重新创建一个新的。
2:也可以是请求转发

格式是:forward:转发地址(controller对象的url)
如:forward:search.action?sid=1
特点:浏览器地址栏不会变化,request在转发前和转发后是同一个

*/
          //返回视图名
        //return "show";
        //请求转发
        return "forward:searchById.action?sid="+student.getSid();
    }
}

当执行返回show页面时,show页面显示代码:

  <body>
  ${msg }
<p style="color: red;">姓名:${student.name}p>
<p style="color: red;">sid:${student.sid}p>
<p style="color: red;">age:${student.age}p>
  body>

controler开发中方法返回值得介绍:

1:可以返回modelAndView
上面有介绍
2:可以返回字符串,表示视图名,或者重定向,和请求转发
上面也有
3:可以返回void,这里不再介绍

在controller方法形参上可以定义requestresponse,使用requestresponse指定响应结果:
1、使用request转向页面,如下:
request.getRequestDispatcher("页面路径").forward(request, response);

2、也可以通过response页面重定向:
response.sendRedirect("url")

3、也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");

在我们学习struts2时,我们可以定义struts2的局部转换器和全局变量转换器,可以将我们需要的数据类型从字符串转换过来,在springmvc中,我们同样可以实现

步骤和struts2一致,首先自定义类型转换器

package com.leige.controler.convert;



import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;

/**
 * @author 自定义类型转换器
 * 实现String到date的转换
 *
 */
public class DateStringConvert implements Converter<String, Date> {

    /* 完成转换操作
     */
    @Override
    public Date convert(String date) {
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        try {
        return  dateFormat.parse(date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

在springmvc中将自己的自定义转换器加入springmvc的转换器列表中


<mvc:annotation-driven conversion-service="conversionService"/>
<context:component-scan base-package="com.leige.controler"/>

        <bean  id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
        <list>
        <bean class="com.leige.controler.convert.DateStringConvert" />
        list>
        property>
        bean>

这里就不在演示使用了,有兴趣的同学可以自己试一试

对了,还有个问题需要要说一下,使用springmvc开发如果遇到中文post乱码问题,只需要在web.xml中配置springmvc的字符编码过滤器就可以了,如下:

<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>

你可能感兴趣的:(spring,springmvc)