1.@RequestMapping注解请求的相关参数
1.设定url
@RequestMapping(value="/getUserByName")
2.窄化请求映射
在Controller上面在添加一道@RequestMapping(value="/User"),实现对于请求需求的分类分组,达到转化请求映射的功能。
3.限制请求方式
@RequestMapping(value="/getUserById", method= {RequestMethod.GET,RequestMethod.POST})设置method,限制请求的方式
4.Controller方法的返回值
1.ModelAndView (将Model和View放在一个独享里面返回)
2.string (返回视图页面的逻辑视图名) 真正视图(jsp)=(视图解析器)前缀+string+(视图解析器)后缀
在这种方式中可以在方法参数中设置Model model,用于待会儿将model传递到页面使用
<!-- 配置jsp视图解析器,"javax.servlet.jsp.jstl.core.Config"默认支持jstl -->
<bean id="ViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置视图页面的前缀和后缀,方便开发 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
例子: 这种方式URL不会变化
public string getOne(Model model) {
model.addAttribute("User",user);
return "UserDetails";
}
-------------------------------------------------------------------------------------------------------------
1.重定向 redirect (url地址栏会发生变化) (request中的数据丢失,因为request无法共享)
例子:
public string saveAndView(Model model) {
model.addAttribute("User",user);
return "redirect:/UserDetails";
}
前提,这种方式相当于将请求依旧转发给系统自己另外的handler进行执行
所以这种方式执行成功的前提是定义了统一的执行handler
@RequestMapping(value = "/{param}") //这种使用restful风格
public String allCanDo(@PathVariable("param") String param) {
return param;
}
2.转发请求 forward (url地址栏不会发生变化) (request可以共享)
forward()方法只能重定向到同一个Web应用程序中的某个资源
例子:
public string saveAndView(Model model) {
model.addAttribute("User",user);
return "forward:/UserDetails";
}
3.void
在controller方法形参上可以定义request和response,使用request或response响应结果
1.使用requset转发页面
request.getRequestDispatcher("/index.jsp").forward(request, response);
2.通过response重定向页面
response.sendRedirect("http://localhost:8090/SSMXML/");
3.也可以通过response指定响应结果,例如响应json数据
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("jsonc串");
2.SpringMVC参数绑定
1.spring默认支持的参数绑定类型
1.HttpServletRequest
2.HttpServletResponse
3.HttpSession
4.Model/ModelMap
实现对简单类型的绑定 (整型,字符串,日期...)
2.注解参数绑定
1.@RequestParam实现对简单类型的绑定
如果不使用@RequestParam,则要求request传入参数名称和controller方法参数形参名称一致,方可绑定成功。
如果使用@RequestParam,则要求request传入参数名称和controller方法参数形参名称可以不一致
@RequestParam(value="id",required=true,defaultValue="1") Integer item_id
value:和形参(item_id)进行绑定
required:指定参数是否必须传入
defaultValue:在未传入参数的情况下,指定形参(item_id)参数默认值
3.pojo参数绑定
1.直接使用pojo作为controller方法的形参就可以直接绑定,但是前提是页面中input标签参数名必须和controller形参中的pojo的属性一致层,才能绑定
问题:在发生get或post请求时,参数传递过程中发生了乱码的情况。
get乱码: 原因Tomcat默认编码为ISO8859-1
解决方案:
1.在tomcat的配置文件中添加uri编码参数
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8090" protocol="HTTP/1.1" redirectPort="8443"/>
2.在接收参数的方法内,对参数进行重新编码
String param=new String(request.getParameter("username").getBytes("ISO8859-1","utf-8"))
post乱码:
解决方案:
1.在web.xml中配置post请求乱码过滤器
<!--post请求乱码过滤器 -->
<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>
4.自定义参数绑定
1.加入controller层现在有一个前端传过来的string型的日期,我们需要将其填充pojo中,但是我们发现我们在pojo中设置的参数类型为Date,很显然如果我们直接绑定就会出现参数绑定异常。
解决:我们自定义参数绑定的转换器,将String型日志转换为Date型
1.在SpringMVC配置文件中添加转换服务配置,springMVC.xml设置转换服务属性
内部操作为将转换服务配置到了处理器适配器实例里面(HandlerAdapter),所以我们使用原始的HandlerAdapter的话,我们就需要在HanlerAdapter里面添加参数配置
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
2.定义一个转换服务的bean(实现类)
<!--定义转换服务bean -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!--引用自定义的转换器 -->
<property name="converters">
<list>
<bean
class="com.ncs.controller.converter.customerDateConverter" />
<!--在这里还可以配置多个转换器,这里是一个list -->
</list>
</property>
</bean>
3.书写自定义的转换器
public class customerDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
try {
// 转换成功,直接返回
return format.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
// 转换失败,返回为空
return null;
}
}
SpringMVC参数绑定使用
1.现在遇到一个问题,一个controller方法需要接受两个pojo,但是这两个pojo里面存在一个同样的属性name,而前端标签名与pojo属性名同名就可以实现参数绑定
那么在遇到同名的情况,springMVC就无法为其进行参数绑定
解决方案:
定义一个PojoVO(扩展类),将那两个pojo都放在这个pojoVO(扩展类里面),然后前端传入参数时,我们就需要添加一层pojoVO属性名,这样便可解决同名传参的问题啦。
2.现在有一种情况,前端复选框实现批量删除,传入一个数组(内部包含,所有pojo的某一特性),SpringMVC可以直接接受这些参数吗?如果可以参数该如何绑定
解决方案:
页面标签参数名必须和数组名一致,才能实现参数绑定
3.现在有一种情况,前端复选框实现批量删除,传入一个list集合(内部包含,所有pojo),SpringMVC该如何接受这些参数?参数该如何实现绑定
解决方案:
可以和pojoVO(扩展类)结合使用,在扩展类里面添加一个pojo属性,和一个List<pojo>属性,这样我们就可以通过listName.pojoName.property在前端页面实现参数绑定