1.回顾servelt
servlet类实现HttpServlet类,重写doGet,doPost方法 (doPost调用doGet方法);
controller层作用:从前台获取数据,调用service层处理,进行视图跳转;
2.SpringMVC中跳转方式
跳转有两种:一种forward,一种redirect.
forward跳转,一次请求,地址栏不变;
redirect跳转,多次请求,地址栏改变
1. Controller跳转到JSP forward跳转到页面 : 默认就是forward跳转 语法 : return "页面逻辑名" redirect跳转到页面: 使用springmvc提供redirect: 关键字进行重定向页面跳转 语法 : return "redirect:/index.jsp" 注意:使用redirect跳转 页面不会经过视图解析器2. Controller跳转到Controller forward:跳转到Controller : 使用springmvc提供的关键字forward: 语法:forward:/跳转类上@RequestMapping的值/跳转类上方法的@RequestMapping的值 redirect:跳转到Controller:使用springmvc 提供的关键字 redircet: 语法:redirect:/跳转类上@RequestMapping的值/跳转类上方法@RequestMapping的值
原始的servlet跳转
forward: 请求转发 一次请求 跳转之后地址栏不变 request作用域传递数据 request.getRequestDispatcher("/servlet路径").forward(request,response);redirect :请求重定向 客户端跳转 多次请求,请求之后地址栏改变 不能使用 request 传递数据 response.sendRedirect("/项目名/servlet路径");
SpringMVC中参数的接收
springmvc : 使用控制器方法参数(形参),接收客户端请求数据 好处: 1. 完成类型的自动转换 2.定义不定长形式参数列表接收客户端请求数据 springmvc中参数接收细节: a.接收零散类型数据 后台在控制器方法中声明多个形参,保证接收参数变量名与前台传递参数变量名一致 b.接收对象类型数据 语法:将要接收对象作为控制器方法形参声明即可 前台传递参数形式: 只需要保证前台传递参数名与接收的对象属性名一致,springmvc自动封装对象 c.接收数组或集合类型数据 语法: 将要 接收数组作为控制器方法的参数声明即可 前台语法: 要求前台传递的多个参数变量名都要 与 后台接收数组变量名一致, springmvc自动将多个变量名放入一个数组中 d.springmvc不支持直接接收集合类型 但是允许间接接收 将接收集合类型放入自定义对象中完成参数接收
SpringMVC解决post方式提交中文乱码问题
charsetfilter-name> org.springframework.web.filter.CharacterEncodingFilterfilter-class> encodingparam-name> UTF-8param-value> init-param>filter> charsetfilter-name> /*url-pattern>filter-mapping>
SpringMVC中数据传值机制
/*总结: 使用forward跳转时使用request传递数据 1.获取request对象: HttpServletRequest 直接在当前控制器方法参数中声明 httpServletRequest对象 2.获取response对象:HttpServletResponse 直接在当前控制器方法参数中声明httpServletResponse对象 EL 表达式 : ${requestScope.name} 引入JSTL : "${requestScope.users}" var= ${user.id}---${user.name} ----${user.age}----{user.bir} ==="${user.bir}" pattern= 第二种方式: springmvc对request对象进一步封装 model对象 封装request作用域 使用redirect跳转页面数据传递 1.使用 return "redirect:/index.jsp"+?id=1 字符串拼接传值 2.使用 session 作用域传值 */
SpringMVC配置url-pattern为"/"导致静态资源拦截问题解决方法
/*1. 在springmvc配置文件中加入如下配置 // 解决静态资源拦截问题*/
SpringMVC文件上传
用户将 自己本地计算机中文件上传到当前使用应用的服务器的过程称之问文件上传a.先在系统中 开发文件上传页面b.文件上传页面的form表单提交方式必须 post enctype必须为umltipart/form-datac.开发对应控制器处理问题上传d.文件上传必须引入 commons-fileupload jar包e.在springmvc使用multipartFile接收文件必须配置文件上传解析器 且 解析器id必须为 multipartResolverf.注意:在springmvc中默认文件上传没有大小限制 可以设置文件大小// FileController@RequestMapping("upload")//在springmvc中使用 multipartFile形式接收文件时必须在springmvc配置文件中配置 文件上传解析器 // 并且文件上传解析器必须存在id, //id必须为multipartResolverpublic String upload(MultipartFile file) {
//需要跟表单的名字一致 System.out.println("文件名:"+ file.getOriginalfilename()); System.out.println("文件类型:"+ file.getContentType(); System.out.println("文件大小:"+ file.getSize(); //处理文件上传 //根据相对upload获取绝对upload路径 String realPath = request.getSession().getServletContext().getRealPath("/upload"); //文件上传 file.transferTo(new File(realPath,file.getOriginalFilename())); return "index";}// springmvc.xmlid=
servlet的文件上传
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=UTF-8"); //上传 try {
boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart) {
//判断前台的form是否有mutipart属性 //FileItemFactory factory = new DiskFileItemFactory(); //缓冲区 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //设置上传文件时 用到的临时文件的大小 DiskFileItemFactory()的对象 factory.setSizeThreshold(10240);//设置临时的缓冲文件大小为10KB factory.setRepository(new File("e:\\BaiduNetdiskDownload\\uploadtemp"));//设置临时文件的目录 //控制上传单个文件的大小 20KB ServletFileUpload(factory)的对象 upload.setSizeMax(20480);//单位是字节 B //通过parseRequest解析form中的所有请求字段,并保存到items集合中(即前台传递的 sno sname spicture 此时就保存在了items中) List items = upload.parseRequest(request); //遍历 items中的数据(sno sname spicture) Iterator iterator = items.iterator(); //使用迭代器 遍历 while(iterator.hasNext()) {
FileItem item = iterator.next(); String itemName = item.getFieldName(); int sno = -1; String sname = null; //判断前台字段 是普通form表单字段(sno sname) ,还是文件字段 if(item.isFormField()) {
if(itemName.equals("sno")) {
//根据name属性判断item是sno sname 还是spicture sno = Integer.parseInt(item.getString("UTF-8")) ; }else if(itemName.equals("sname")) {
sname = item.getString("UTF-8"); }else {
System.out.println("其他字段....."); } }else{
//spicture //文件上传 //文件名 //getName() 是 获取 文件名 String fileName = item.getName(); String ext = fileName.substring(fileName.indexOf(".")+1); if(! ext.equals("png") || ext.equals("gif") || ext.equals("jpg")) {
System.out.println("图片类型有误!格式只能是png gif jpg"); return ;//终止 } //获取文件内容 并上传 //定义文件路径:指定上传的位置(服务器路径) //获取服务器路径 E:\BaiduNetdiskDownload\apache-tomcat-9.0.26-windows-x64\apache-tomcat-9.0.26\wtpwebapps\UpAndDown //String path = request.getSession().getServletContext().getRealPath("upload"); String path = "E:\\BaiduNetdiskDownload\\upload"; File file = new File(path,fileName); item.write(file); //上传 System.out.println(fileName+"上传成功"); PrintWriter out = response.getWriter(); out.println(fileName+"上传成功"); return; } } } }catch (FileUploadBase.SizeLimitExceededException e) {
// TODO: handle exception System.out.println("上传文件大小大于20KB"); }catch (FileUploadException e) {
// TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) {
// TODO Auto-generated catch block e.printStackTrace(); } }
SpringMVC对 ajax支持,@RequestBody注解的使用
/* 第一种方式 在控制器中使用原生的 json转换工具 Gson */ String json = new Gson().toJSON(对象); response.setContentType("application/json;charset=UTF-8"); response.getWriter().print(json);/* 第二种方式 @ResponseBody 需要引入jackson 或者 Gson 作用:将 当前方法的 返回值自动转为json格式数据并响应前台 */
SpringMVC 拦截器 interceptors
/* 拦截器 类似与 javaWeb中的 filter 不同于 filter 主要是用来对应用中的请求(控制器的方法)做拦截作用 作用 : 将多个控制器中执行共有代码 放入拦截器中执行,从而减少 controller中代码冗余 举例: 比如在做 加入购物车时 先判断 有没有登录 , 下单的时候 判断有没有登录 特点: a.拦截器只能拦截控制器相关请求,不能拦截 jsp相关的请求 b.拦截器可以直接中断用户请求轨迹 c.请求到达会经过拦截器,请求回来同样会经过拦截器 拦截器的开发: 1.MyIntercetptor implements HandlerInterceptor{
public boolean preHandler(...){} public void postHandler(...){} public void afterCompletion(...){} } 2.配置拦截器 a.注册拦截器 bean> b. 配置拦截器的请求 bean> bean> mvc:interceptor> mvc:interceptors> */
SpringMVC全局异常处理
/*1.全局异常处理 当项目在运行的过程中出现异常时的处理机制 注意: 全局异常处理 一定是 “抛出来的” 异常 try处理过的不行 好处:当系统出现运行时异常,用户可以 友好的方式看到错误页面 2.自定义全局异常处理类 public class CustomerExceptionResolver implements HanderExceptionResolver{
// 实现 resolverException方法 } 3. 在springmvc.xml中配置全局异常处理类 */