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]
用户可以构造如知名网站淘宝的重定向连接,形如打折新款,引导用户点击后进入钓鱼网站,在界面上让其进行登陆用以获取用户的密码。
表单:
基本参数绑定
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;
}
表单
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>
1:可以返回modelAndView
上面有介绍
2:可以返回字符串,表示视图名,或者重定向,和请求转发
上面也有
3:可以返回void,这里不再介绍
在controller方法形参上可以定义request和response,使用request或response指定响应结果:
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一致,首先自定义类型转换器
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>