c语言做的网站有什么优缺点,如何在亚马逊上开店卖到国外,贷款类网站怎样做,各类网站推广文章目录 一、SpringMVC 概述二、springMVC步骤1、新建maven的web项目2、导入maven依赖3、创建controller4、创建spring-mvc.xml配置文件#xff08;本质就是spring的配置件#xff09;5、web.xml中配置前端控制器6、新建a.jsp文件7、配置tomcat8、启动测试 三、工作流程分析… 文章目录 一、SpringMVC 概述二、springMVC步骤1、新建maven的web项目2、导入maven依赖3、创建controller4、创建spring-mvc.xml配置文件本质就是spring的配置件5、web.xml中配置前端控制器6、新建a.jsp文件7、配置tomcat8、启动测试 三、工作流程分析四、请求参数的绑定五、响应1、转发默认2、重定向3、配置视图解析器 六、拦截器1、拦截器 Interceptor2、拦截器使用步骤2.1、实现HandlerInterceptor接口2.2、配置拦截器2.3、拦截器配置项2.4、拦截器的使用场景2.5、拦截器登录案例 七、文件上传1、导入maven依赖2、前端页面3、配置多媒体解析器4、后台代码5、前端代码使用现成的。如果jquery不能用了可以引用网络地址 一、SpringMVC 概述
Spring MVC是Spring Framework提供的Web组件全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架提供前端路由映射、视图解析等功能
Java Web开发者必须要掌握的技术框架
三层架构 表现层负责数据展示 业务层负责业务处理 数据层负责数据操作 概念 Spring MVC 是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。 MVCModel View Controller一种用于设计创建Web应用程序表现层的模式 Model模型数据模型用于封装数据View视图页面视图用于展示数据ControllerHandle 处理器处理用户交互的调度器用于根据用户需求处理程序逻辑
二、springMVC步骤
1、新建maven的web项目 2、导入maven依赖
dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope
/dependency!-- servlet3.1规范的坐标 --
dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/versionscopeprovided/scope
/dependency
!--jsp坐标--
dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjsp-api/artifactIdversion2.1/versionscopeprovided/scope
/dependency
!--spring的坐标--
dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.1.9.RELEASE/version
/dependency
!--spring web的坐标--
dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.1.9.RELEASE/version
/dependency
!--springmvc的坐标--
dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.1.9.RELEASE/version
/dependency3、创建controller
Controller
public class UserController {RequestMapping(/save)public String say(){System.out.println(你好);return a.jsp;}
}4、创建spring-mvc.xml配置文件本质就是spring的配置件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:contexthttp://www.springframework.org/schema/contextxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.xinzhi/
/beans5、web.xml中配置前端控制器
servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath*:spring-mvc.xml/param-value/init-param
/servlet
servlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern
/servlet-mapping6、新建a.jsp文件
7、配置tomcat
8、启动测试
注意如果报找不到包 mvn ideamodule
三、工作流程分析
服务器启动 加载web.xml中DispatcherServlet读取spring-mvc.xml中的配置加载所有com.xinzhi包中所有标记为bean的类读取bean中方法上方标注RequestMapping的内容 处理请求 DispatcherServlet配置拦截所有请求 /使用请求路径与所有加载的RequestMapping的内容进行比对执行对应的方法根据方法的返回值在webapp目录中查找对应的页面并展示 web三大组件有 处理器映射处理器适配器, 视图解析器 1 dispatcherServlet 前置控制器负责接收并处理所有的web请求根据handlerMapping(处理器映射)找到具体的Controller(处理器)由controller完成具体的处理逻辑。 2 HandlerMapping(处理器映射器)负责处理web请求和具体的Controller之间的映射关系匹配。 3HandlerAdapter处理器适配器 通过 HandlerAdapter 对处理器进行执行这是适配器模式的应用通过扩展适配器可以对更多类型的处理器进行执行。 主要处理方法参数、相关注解、数据绑定、消息转换、返回值、调用视图解析器等等。 4.Controller(处理器)DispatherServlet的次级控制器web请求的具体处理者。DispatherServlet获得handlerMapping的返回结果后调用controller的处理方法处理当前的业务请求处理完成后返回ModelAndView对象。 5 ViewResolver( 视图解析器)用来处理视图名与具体的view实例之间的映射对应关系。根据ModelAndView中的视图名查找相应的View实现类然后将查找的结果返回给DispatcherServletDispatcherServlet最终会将ModelAndView中的模型数据交给返回的View处理最终的视图渲染工作。 Springmvc架构原理解析 第一步发起请求到前端控制器(DispatcherServlet) 第二步前端控制器请求HandlerMapping查找 Handler可以根据xml配置、注解进行查找 第三步处理器映射器HandlerMapping向前端控制器返回Handler 第四步前端控制器调用处理器适配器去执行Handler 第五步处理器适配器去执行Handler 第六步Handler执行完成给适配器返回ModelAndView 第七步处理器适配器向前端控制器返回ModelAndView ModelAndView是springmvc框架的一个底层对象包括 Model和view 第八步前端控制器请求视图解析器去进行视图解析 根据逻辑视图名解析成真正的视图(jsp) 第九步视图解析器向前端控制器返回View 第十步前端控制器进行视图渲染 视图渲染将模型数据(在ModelAndView对象中)填充到request域 第十一步前端控制器向用户响应结果
四、请求参数的绑定
默认类型
直接放在参数上就可以使用的数据HttpServletRequest
简单类型:
直接将简单类型的数据放在方法里如果前端参数和后端参数名字一样自动匹配
名字不一样RequsetParam(“前端的值”) 就可以将前传的值和后端参数映射
对象
前端的参数要和对象的属性名称必须一致会自动封装。
对象嵌套
参数和对象的属性名称一致前端参数对象子属性必须(子对象.属性)
自定义数据的绑定
5.1 编写转换器类作用是将前端的数据类型转换成后端的数据类型继承converter
5.2 配置文件中添加转化器驱动
数组
前端数组中是简单类型的数据那么前端数组中的name要和后端数组名称一致
集合
后端接受的对象是含有List对象属性的那么前端的name值格式要和后端list属性名称一致而且用索引的格式 list[0].属性list集合里对象的属性名称
# 1 默认类型RequestMapping(/m1)public ModelAndView say(HttpServletRequest request, ModelAndView modelAndView){String name request.getParameter(name);System.out.println(name);modelAndView.setViewName(a.jsp);modelAndView.addObject(name, name);return modelAndView;
}jsp页面中要引入
% page isELIgnoredfalse%
% taglib prefixc urihttp://java.sun.com/jsp/jstl/core%body${name}
/body# 简单类型:
RequestMapping(/m2)public String say2(RequestParam(username) String name, String age){System.out.println(name);System.out.println(age);return a.jsp;
}# 对象类型
RequestMapping(/m3)public String say3(Student student){System.out.println(student);return b.jsp;
}
访问路径 http://localhost:8080/webdemo_war/m4?id1num111122223333user.age11user.username%E9%9F%A9%E5%93%A5%E5%93%A5# 数组RequestMapping(/m5)public String say5(Integer[] ids){if(ids!null){for (Integer id : ids) {System.out.println(id);}}return b.jsp;}
访问路径http://localhost:8080/webdemo_war/m5?ids1ids2# list类型RequestMapping(/m6)public String say6(RequestParam(hobby)ListString hobby){System.out.println(hobby);return b.jsp;
}
http://localhost:8080/webdemo_war/m6?hobby%E6%B8%B8%E6%B3%B3hobby%E6%B3%A1%E5%A6%9E
注意 SpringMVC默认将List作为对象处理赋值前先创建对象然后将hobby作为对象的属性进行处理。由于
List是接口无法创建对象报无法找到构造方法异常修复类型为可创建对象的ArrayList类型后对象可
以创建但没有hobby属性因此数据为空。此时需要告知SpringMVC的处理器hobby是一组数据而不是一个单
一数据。通过RequestParam注解将数量大于1个names参数打包成参数数组后 SpringMVC才能识别该数
据格式并判定形参类型是否为数组或集合并按数组或集合对象的形式操作数据。 自定义数据绑定 定义转换器 public class MyDateConverter implements ConverterString, Date {Overridepublic Date convert(String s) {DateFormat df new SimpleDateFormat(yyyy-MM-dd);Date date null;try {date df.parse(s);} catch (ParseException e) {e.printStackTrace();}return date;}
}注解驱动使转换器起作用 !--1.将自定义Converter注册为Bean受SpringMVC管理--
bean idmyDateConverter classcom.xinzhi.converter.MyDateConverter/
!--2.设定自定义Converter服务bean--
bean idconversionServiceclassorg.springframework.context.support.ConversionServiceFactoryBean!--3.注入所有的自定义Converter该设定使用的是同类型覆盖的思想--property nameconverters!--4.set保障同类型转换器仅保留一个去重规则以ConverterS,T的泛型为准--set!--5.具体的类型转换器--ref beanmyDateConverter//set/property
/bean
!--开启注解驱动加载自定义格式化转换器对应的类型转换服务--
mvc:annotation-driven conversion-serviceconversionService/五、响应
1、转发默认
controller返回值是String return “forward:page.jsp”;
2、重定向
controller返回值是String return “redirect:page.jsp”;
3、配置视图解析器
# 展示页面的保存位置通常固定且结构相似可以设定通用的访问路径简化页面配置格式
bean classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix value/WEB-INF/page//property namesuffix value.jsp/
/bean六、拦截器
1、拦截器 Interceptor
是一种动态拦截方法调用的机制
# 作用1. 在指定的方法调用前后执行预先设定后的的代码2. 阻止原始方法的执行# 核心原理 AOP思想
# 拦截器链多个拦截器按照一定的顺序对原始被调用功能进行增强 2、拦截器使用步骤
2.1、实现HandlerInterceptor接口
/*** 三个方法的运行顺序为 preHandle - postHandle - afterCompletion* 如果preHandle返回值为false三个方法仅运行preHandle*/
public class MyInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(前置运行----a1);//返回值为false将拦截原始处理器的运行//如果配置多拦截器返回值为false将终止当前拦截器后面配置的拦截器的运行return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(后置运行----b1);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(完成运行----c1);}
}2.2、配置拦截器 mvc:interceptorsmvc:interceptormvc:mapping path/m8/bean classcom.xinzhi.intercepter.MyInterceptor//mvc:interceptor/mvc:interceptors2.3、拦截器配置项
mvc:interceptors!--开启具体的拦截器的使用可以配置多个--mvc:interceptor!--设置拦截器的拦截路径支持*通配--!--/** 表示拦截所有映射--!--/* 表示拦截所有/开头的映射--!--/user/* 表示拦截所有/user/开头的映射--!--/user/add* 表示拦截所有/user/开头且具体映射名称以add开头的映射--!--/user/*All 表示拦截所有/user/开头且具体映射名称以All结尾的映射--mvc:mapping path/*/mvc:mapping path/**/mvc:mapping path/handleRun*/!--设置拦截排除的路径配置/**或/*达到快速配置的目的--mvc:exclude-mapping path/b*/!--指定具体的拦截器类--bean classMyInterceptor//mvc:interceptor
/mvc:interceptors2.4、拦截器的使用场景
1日志记录记录请求信息的日志以便进行信息监控、信息统计、计算PVPage View等。
2权限检查如登录检测进入处理器检测是否登录如果没有直接返回到登录页面
3性能监控有时候系统在某段时间莫名其妙的慢可以通过拦截器在进入处理器之前记录开始时间在处理完后记录结束时间从而得到该请求的处理时间如果有反向代理如apache可以自动记录
2.5、拦截器登录案例
Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {String uri request.getRequestURI();if(uri.equal(/login)){return true;}HttpSession session request.getSession();Object user session.getAttribute(USER_SESSION);if(user!null){return true;}request.setAttribute(msg,未登陆状态);request.getRequestDispatcher(/WEB-INF/jsp/login.jsp).forward(request,response);return false;}mvc:interceptorsmvc:interceptormvc:mapping path/** /bean classcom.soft.interceptor.LoginInterceptor //mvc:interceptor
/mvc:interceptors 七、文件上传
1、导入maven依赖 commons-fileupload commons-fileupload 1.4
2、前端页面
form action/fileupload methodpost enctypemultipart/form-data上传LOGO input typefile namefile/br/input typesubmit value上传/
/form3、配置多媒体解析器
bean idmultipartResolverclassorg.springframework.web.multipart.commons.CommonsMultipartResolver
/bean4、后台代码
package com.xinzhi.controller;import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.UUID;Controller
public class FileUploadController {/*** 上传页面跳转* return*/RequestMapping(value /upload,method RequestMethod.GET)public String upload(){return fileUpload;}/*** 下载页面跳转* return*/RequestMapping(value /down,method RequestMethod.GET)public String down(){return download;}/*** 上传逻辑* param uploadfile 上传的文件数组* return*/RequestMapping(value /fileUpload,method RequestMethod.POST)public String uploadFile(MultipartFile[] uploadfile){for (MultipartFile file : uploadfile) {//获取文件名称String filename file.getOriginalFilename();//存在服务器上名称的修改filename UUID.randomUUID()_filename;// 定义服务器上的存储路径String dirPath C:/file/;File filePath new File(dirPath);// 判断路径是否存在,不存在就创建if(!filePath.exists()){filePath.mkdir();}try {// 文件上传的核心file.transferTo(new File(dirPathfilename));} catch (IOException e) {e.printStackTrace();return error;}}return success;}RequestMapping(/download)public ResponseEntitybyte[] fileDownload(HttpServletRequest request,String filename) throws UnsupportedEncodingException {//指定文件下载地址的目录 filename - 美女.jpgString dirPath F:/file;// 指定下载的文件名称File file new File(dirPath File.separator filename);HttpHeaders headers new HttpHeaders();// 解决不同浏览器之间乱码问题filename getFilename(request, filename);//告诉浏览器打开方式附件headers.setContentDispositionFormData(attachment,filename);//以二进制字节流的方式下载headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);try {return new ResponseEntity(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);} catch (IOException e) {e.printStackTrace();return new ResponseEntity(e.getMessage().getBytes(), HttpStatus.EXPECTATION_FAILED);}}/*** 不同浏览器的版本兼容* param request* param filename* return* throws UnsupportedEncodingException*/private String getFilename(HttpServletRequest request,String filename) throws UnsupportedEncodingException {//判断是不是IE内核的关键字String[] IEBrowerKeyWords {MSIE,Trident,Edge};String keywords request.getHeader(User-Agent);for (String keyWord : IEBrowerKeyWords) {if(keywords.contains(keyWord)){ //判断是否为IE浏览器return URLEncoder.encode(filename,UTF-8);}}// 其他浏览器编码格式ISO-8859-1return new String(filename.getBytes(UTF-8),ISO-8859-1);}
}
5、前端代码使用现成的。如果jquery不能用了可以引用网络地址
script srchttp://code.jquery.com/jquery-latest.js/script