@RequestMapping注解的使用 路径映射可以是数组
@RequestMapping(value={"itemList","itemList2"})
@RequestMapping可以加在类头部,用于目录分级管理为了避免名称冲突,可以使用分目录管理
如果同时使用post 和get 页面可能会出现乱码的问题 可以在服务的server.xml文件做一下红框的修改
- 返回void
- request
新建msg.jsp
response
返回String
返回视图名字
redirect与forward
关于乱码问题的总结 提交问题
post乱码:使用过滤器解决
get乱码:tomcat配置一个URIEncoding="utf-8"
响应的问题:问题产生的原因:浏览器默认的编码跟服务器的编码不一致
response乱码:在获取Response之前 response.setCharacterEncoding("utf-8");
Springmvc中异常处理思想:做一个全局异常处理器,处理所有没有处理过的运行时异常用于更友好地提示用户。
创建全局异常处理器
/**
* 全局异常处理器
* @author Steven
*
*/
public class CustomerException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,
Exception e) {
//记录日志
e.printStackTrace();
//错误消息
String msg = "很抱歉,系统发生异常了,请联系管理员";
//响应用户错误提示
ModelAndView mav = new ModelAndView();
//返回错误消息
mav.addObject("msg", msg);
//响应错误提示页面
mav.setViewName("msg");
return mav;
}
}
配置异常处理器
测试访问queryVoid.action
新建自定义异常类
/**
* 自定义异常
* @author Steven
*
*/
public class MyException extends Exception {
//错误消息
private String msg;
public MyException() {
super();
}
public MyException(String msg) {
super();
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
修改异常处理器,加上异常判断
测试访问queryVoid.action
配置虚拟目录
jsp修改
需要注意的是,选择文件上传,form表单的类型就必须是下图红框里边的,另外,也必须是post,不能是get,get限制了文件上传的大小,另外get不能上传文件。
//图片上传用MultipartFile接收文件
@RequestMapping(value = "updateItem", method = { RequestMethod.POST, RequestMethod.GET })
public String updateItem(Item item, Model model, MultipartFile picFile) throws Exception {
// 图片新名字
String name = UUID.randomUUID().toString();
// 图片原名字
String oldName = picFile.getOriginalFilename();
// 后缀名
String exeName = oldName.substring(oldName.lastIndexOf("."));
File pic = new File("D:\\WebWork\\" + name + exeName);
// 保存图片到本地磁盘
picFile.transferTo(pic);
// 更新商品图片信息
item.setPic(name + exeName);
itemServices.update(item);
model.addAttribute("item", item);
model.addAttribute("msg", "修改商品成功");
return "itemEdit";
}
json数据交互
加入jar包
/**
* json数据交互演示
*
* @param item2
* @return
*/
@RequestMapping("getItem")
//@ResponseBody把pojo转成json串响应用户
@ResponseBody
//@RequestBody用于接收用户传入json串转成pojo
public Item getItem(@RequestBody Item item2) {
System.out.println("接收到的json商品数据为:" + item2);
Item item = itemServices.getItemById(3);
return item;
}
Springmvc实现Restful
restful风格
编码
/**
* RESTful风格演示
*
* @param ids
* @param model
* @return
*/
//RESTful风格url上的参数通过{}点位符绑定
//点位符参数名与方法参数名不一致时,通过@PathVariable绑定
@RequestMapping("/item/{id}")
public String testRest(@PathVariable("id") Integer ids, Model model) {
Item item = itemServices.getItemById(ids);
model.addAttribute("item", item);
return "itemEdit";
}
测试
测试直接访问url{http://localhost:8080/项目名/item/1.action}即可。
拦截器
拦截器开发流程
创建拦截器(第一个拦截器)
/**
* 自定义拦截器
* @author Steven
*
*/
public class MyInterceptor1 implements HandlerInterceptor {
//在Controller方法执行后被执行
//处理异常、记录日志
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("MyInterceptor1.afterCompletion.....");
}
//在Controller方法执行后,返回ModelAndView之前被执行
//设置或者清理页面共用参数等等
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("MyInterceptor1.postHandle.....");
}
//在Controller方法执行前被执行
//登录拦截、权限认证等等
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("MyInterceptor1.preHandle.....");
//返回true放行,false拦截
return true;
}
}
创建第二个拦截器(复制一号,修改一下系统输出消息)
配置拦截器
测试流程
- 有一个登录页面,需要写一个controller访问页面
- 登录页面有一提交表单的动作。需要在controller中处理。
- 判断用户名密码是否正确
- 如果正确 想session中写入用户信息
- 返回登录成功,或者跳转到商品列表
- 拦截器。
- 拦截用户请求,判断用户是否登录
- 如果用户已经登录。放行
3.如果用户未登录,跳转到登录页面。
登录页面 login.jsp
用户登录
用户名:
密码:
登录拦截器 UserController
/**
* 登录拦截器
* @author Steven
*
*/
@Controller
@RequestMapping("user")
public class UserController {
/**
* 跳转登录页面
* @return
*/
@RequestMapping("toLogin")
public String toLogin(){
return "login";
}
/**
* 用户登录
* @return
*/
@RequestMapping("login")
public String login(String username,String password,HttpSession session){
String result = "login";
//断定用户是否允许登录
if(username != null){
session.setAttribute("username", username);
//登录成功,跳转商品列表
result = "redirect:/itemList.action";
}
return result;
}
}
LoginInterceptor拦截器编码
这里省略类声名和其它两个方法。
//处理执行前被执行
//登录拦截、权限验证
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
Object attribute = request.getSession().getAttribute("username");
if(attribute != null){
//放行,执行处理器
return true;
}else{
response.sendRedirect(request.getContextPath() + "/user/tologin.action");
//放行,执行处理器
return false;
}
}
拦截器配置