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]
用户可以构造如知名网站淘宝的重定向连接,形如打折新款,引导用户点击后进入钓鱼网站,在界面上让其进行登陆用以获取用户的密码。
表单:
基本参数绑定
<form action="${pageContext.request.contextPath }/student/searchById.action" method="post" >
id:<input type="text" name="sid" ><br/>
<input type="submit" value="提交">
</form>
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类参数绑定:
<!-- 注意springmvc数据绑定时不能使用:enctype="multipart/form-data" -->
<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"/>
<!-- 配置自定义转换器,即将自己的自定义转换器加入sprigmvc的转换器列表中 -->
<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>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>