-
SpringMVC
2020-09-20 11:24:27SSM框架之SpringMvc springmvc Spring需要导入的Jar包 1.jar spring-aop.jar spring-bean.jar spring-context.jar spring-core.jar spring-web.jar SpringMvc框架需要导入的Jar包 spring-webmvc.jar commons-...SSM框架之SpringMvc
springmvc
-
Spring需要导入的Jar包
1.jar
spring-aop.jar
spring-bean.jar
spring-context.jar
spring-core.jar
spring-web.jar -
SpringMvc框架需要导入的Jar包
spring-webmvc.jar
commons-logging.jar
报错NoClassDefFoundError:缺少jar
SpringMvc的意义
Servet - Springmvc
jsp ->Servlet (Springmvc)->Jspurl
springmvc配置文件 springmvc.xml
选中常用的命名空间:beans aop context mvc普通的servlet流程:
请求-url-pattern -交给对应的servlet去处理如果现在想用springmvc,而不是普通的servlet,如何告知程序?-如何让springmvc 介入程序:
需要配置一个 Springmvc自带的servlet通过以下配置,拦截所有请求,交给SpringMVC处理:
<servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
其中:
<url-pattern>.action</url-pattern>
- /:一切请求 ,注意不是 /*
- /user:拦截以 /user开头的请求
- /user/abc.do :只拦截该请求
- .action:只拦截 .action结尾的请求
项目中同时兼容 springMVC和Servlet
<servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>.action</url-pattern> </servlet-mapping> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
通过
指定springmvc配置文件的路径,如果要省略,必须放到 默认路径:
/WEB-INF/springDispatcherServlet-servlet.xml映射是去匹配@RequestMapping注解,可以和方法名、类名不一致
通过method指定 请求方式(get post delete put)
@RequestMapping(value=“welcome”,method=RequestMethod.POST) //映射-
设置name="xxxx"的情况:
params= {“name2=zs”,“age!=23”}name2:必须有name="name2"参数
age!=23 : a.如果有name=“age”,则age值不能是23
b.没有age
!name2 :不能name="name2"的属性 -
ant风格的请求路径
? 单字符
任意个字符(0或多个)
** 任意目录
@RequestMapping(value=“welcome3/**/test”)
接受示例:a href=“welcome3/abc/xyz/abccc/test”
-
通过@PathVariable获取动态参数
public String welcome5(@PathVariable(“name”) String name ) {
System.out.println(name);
return “success” ;
} -
Springmvc: REST风格 :软件编程风格
-
GET : 查
-
POST :增
-
DELETE :删
-
PUT :改
-
-
普通浏览器 只支持get post方式 ;其他请求方式 如 delelte|put请求是通过 过滤器新加入的支持。
springmvc实现 :put|post请求方式的步骤
a.增加过滤器
<!-- 增加HiddenHttpMethodFilte过滤器:目的是给普通浏览器 增加 put|delete请求方式 --> <filter> <filter-name>HiddenHttpMethodFilte</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilte</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
b.表单
<form action="handler/testRest/1234" method="post"> <input type="hidden" name="_method" value="DELETE"/> <input type="submit" value="删"> </form>
i:必须是post方式
ii:通过隐藏域 的value值 设置实际的请求方式 DELETE|PUTc.控制器
@RequestMapping(value="testRest/{id}",method=RequestMethod.DELETE) public String testDelete(@PathVariable("id") Integer id) { System.out.println("delete:删 " +id); //Service层实现 真正的增 return "success" ;// views/success.jsp,默认使用了 请求转发的 跳转方式 }
通过 method=RequestMethod.DELETE 匹配具体的请求方式
此外,可以发现 ,当映射名相同时@RequestMapping(value="testRest),可以通过method处理不同的请求。
过滤器中 处理put|delete请求的部分源码:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { HttpServletRequest requestToUse = request; if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) { String paramValue = request.getParameter(this.methodParam); if (StringUtils.hasLength(paramValue)) { requestToUse = new HttpMethodRequestWrapper(request, paramValue); } } filterChain.doFilter(requestToUse, response); }
原始请求:request,改请求 ,默认只支持get post header
但是如果 是"POST" 并且有隐藏域<input type="hidden" name="_method" value="DELETE"/>
则,过滤器 将原始的请求 request加入新的请求方式DELETE,并将原始请求 转为 requestToUse 请求(request+Delete请求)
最后将requestToUse 放入 请求链中, 后续再请求request时 实际就使用改造后的 requestToUse@RequestParam("uname")String name @RequestParam(value="uage",required=false,defaultValue="23") @RequestParam("uname"): 接受前台传递的值,等价于request.getParameter("uname"); required=false:该属性 不是必须的。 defaultValue="23":默认值23
获取请求头信息
@RequestHeader public String testRequestHeader(@RequestHeader("Accept-Language") String al ) { 通过@RequestHeader("Accept-Language") String al 获取请求头中的Accept-Language值,并将值保存再al变量中
通过mvc获取cookie值(JSESSIONID)
@CookieValue
(前置知识: 服务端在接受客户端第一次请求时,会给该客户端分配一个session (该session包含一个sessionId)),并且服务端会在第一次响应客户端时 ,请该sessionId赋值给JSESSIONID 并传递给客户端的cookie中小结:
SpringMVC处理各种参数的流程/逻辑:
请求: 前端发请求a-> @RequestMappting(“a”)
处理请求中的参数xyz:@RequestMappting("a") public String aa(@Xxx注解("xyz") xyz) { }
使用对象(实体类Student)接受请求参数
在SpringMVC中使用原生态的Servlet API :HttpServletRequest :直接将 servlet-api中的类、接口等 写在springMVC所映射的方法参数中即可:
@RequestMapping(value="testServletAPI") public String testServletAPI(HttpServletRequest request,HttpServletResponse response) { // request.getParameter("uname") ; System.out.println(request); return "success" ; }
1.处理模型数据
如果跳转时需要带数据:V、M,则可以使用以下方式:
ModelAndView、ModelMap 、Map、Model -数据放在了request作用域@SessionAttributes、@ModelAttribute
示例:
public String testModel(Model model| Map<String,Object> m) { m.put(x,".."); 就会将x对象 放入request域中 如何将上述数据放入session中?@SessionAttributes(..) }
@ModelAttribute
i.经常在 更新时使用
ii.在不改变原有代码的基础之上,插入一个新方法。通过@ModelAttribute修饰的方法 ,会在每次请求前先执行;
并且该方法的参数map.put()可以将 对象 放入 即将查询的参数中;
必须满足的约定:
map.put(k,v) 其中的k 必须是即将查询的方法参数 的首字母小写
testModelAttribute(Student xxx) ,即student;
如果不一致,需要通过@ModelAttribute声明。如下:@ModelAttribute//在任何一次请求前,都会先执行@ModelAttribute修饰的方法 public void queryStudentById(Map<String,Object> map) { //StuentService stuService = new StudentServiceImpl(); //Student student = stuService.queryStudentById(31); //模拟调用三层查询数据库的操作 Student student = new Student(); student.setId(31); student.setName("zs"); student.setAge(23); map.put("stu", student) ;//约定:map的key 就是方法参数 类型的首字母小写 } //修改:Zs-ls @RequestMapping(value="testModelAttribute") public String testModelAttribute(@ModelAttribute("stu")Student student) { student.setName(student.getName());//将名字修改为ls System.out.println(student.getId()+","+student.getName()+","+student.getAge()); return "success"; }
一个Servlet 对应一个功能:
增删改查 对应于 4个Servlet更新: Servlet - SpringMVC的Controller
查询
@ModelAttribute
public void query()
{}
修改
public String update()
{}
@ModelAttribute会在 该类的每个方法执行前 均被执行一次,因为使用时需要注意。
2.视图、视图解析器
视图的顶级接口: View
视图解析器:ViewResolver常见的视图和解析器:
InternalResourceView、InternalResourceViewResolverpublic class JstlView extends InternalResourceView:
springMVC解析jsp时 会默认使用InternalResourceView,
如果发现Jsp中包含了jstl语言相关的内容,则自动转为JstlView。JstlView 可以解析jstl\实现国际化操作
国际化: 针对不同地区、不同国家 ,进行不同的显示
中国:(大陆、香港) 欢迎
美国: welcome- i18n_zh_CH.properties
- resource.welcome=你好
- resource.exist=退出
- i18n.properties
具体实现国际化步骤:
-
a.创建资源文件
基名_语言_地区.properties
基名_语言.properties -
b.配置springmvc.xml,加载资源文件
<!-- 加载国际化资源文件 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"></property> </bean>
ResourceBundleMessageSource会在springmvc响应程序时 介入(解析国际化资源文件)
c.通过jstl使用国际化
jstl.jar standar.jarspringmvc在启动时,会自动查找一个id="messageSource"的bean,如果有 则自动加载
InternalResourceViewResolver其他功能:
- 在配置文件中填写映射地址
1.<mvc:view-controller …>
index.jsp -> Controller(@RequsetMapping(“a”)) ->succes.jsp要用SpringMVC实现:index.jsp -> succes.jsp :
<mvc:view-controller path=“a” view-name=“success” />以上注解 ,会让所有的请求 转入mvc:..中匹配映射地址,而会忽略调@RequsetMapping();
如果想让 @RequsetMapping(“a”) 和mvc:..共存,则需要加入一个注解:mvc:annotation-driven</mvc:annotation-driven>2.指定请求方式
指定跳转方式:return “forward:/views/success.jsp”;
forward: redirect: ,需要注意 此种方式,不会被视图解析器加上前缀(/views)、后缀(.jsp)
3.处理静态资源:html css js 图片 视频
可以与用户交互、因为时间/地点的不同 而结果不同的内容:动态(百度:天气 )
在SpringMVC中,如果直接访问静态资源:404 。原因:之前将所有的请求 通过通配符“、” 拦截,进而交给 SPringMVC的入口DispatcherServlet去处理:找该请求映射对应的 @requestMapping
http://localhost:8888/SpringMVCProject/img.png
@RequsetMapping(“img.png”)
return sucess解决:如果是 需要mvc处理的,则交给@RequsetMapping(“img.png”)处理;如果不需要springmvc处理,则使用 tomcat默认的Servlet去处理。
tomcat默认的Servlet去处理:如果有 对应的请求拦截,则交给相应的Servlet去处理;如果没有对应的servlet,则直接访问。
tomcat默认的Servlet在哪里?在tomcat配置文件\conf\web.xml中<servlet> <servlet-name>abc</servlet-name> <servlet-class>xxx.xxx.xx.ABCServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>abc</servlet-name> <url-pattern>/abc</url-pattern> </servlet-mapping>
解决静态资源方案:如果有springmvc对应的@requestMapping则交给spring处理;如果没有对应@requestMapping,则交给服务器tomcat默认的servlet去处理 :实现方法,只需要增加2个注解即可
springmvc.xml: <mvc:default-servlet-handler></mvc:default-servlet-handler> <mvc:annotation-driven></mvc:annotation-driven> 总结:要让springmvc访问静态资源,只需要加入以下2个注解: <mvc:default-servlet-handler></mvc:default-servlet-handler> <mvc:annotation-driven></mvc:annotation-driven>
4.类型转换
-
a.Spring自带一些 常见的类型转换器:
public String testDelete(@PathVariable(“id”) String id) ,即可以接受int类型数据id 也可以接受String类型的id -
b.可以自定义类型转换器
i.编写 自定义类型转器的类 (实现Converter接口)
public class MyConverter implements Converter<String,Student>{
@Override public Student convert(String source) {//source:2-zs-23 //source接受前端传来的String:2-zs-23 String[] studentStrArr = source.split("-") ; Student student = new Student(); student.setId( Integer.parseInt( studentStrArr[0]) ); student.setName(studentStrArr[1]); student.setAge(Integer.parseInt(studentStrArr[2] )); return student; }
}
ii.配置:将MyConverter加入到springmvc中
<bean id="myConverter" class="org.lanqiao.converter.MyConverter"></bean>
<!-- 2将myConverter再纳入 SpringMVC提供的转换器Bean --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="myConverter"/> </set> </property> </bean> <!-- 3将conversionService注册到annotation-driven中 --> <!--此配置是SpringMVC的基础配置,很功能都需要通过该注解来协调 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
测试转换器:
@RequestMapping(value="testConverter") public String testConverter(@RequestParam("studentInfo") Student student) {// 前端:2-zs-23 System.out.println(student.getId()+","+student.getName()+","+student.getAge()); return "success"; }
其中@RequestParam(“studentInfo”)是触发转换器的桥梁:
@RequestParam(“studentInfo”)接受的数据 是前端传递过来的:2-zs-23 ,但是 需要将该数据 复制给 修饰的目的对象Student;因此SPringMVC可以发现 接收的数据 和目标数据不一致,并且 这两种数据分别是 String、Student,正好符合public Student convert(String source)转换器。5.数据格式化
SimpleDateForamt sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
SPringMVC提供了很多注解,方便我们数据格式化
实现步骤:
a.配置<!-- 配置 数据格式化 注解 所依赖的bean --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> </bean>
b.通过注解使用
@DateTimeFormat(pattern=“yyyy-MM-dd”)
@NumberFormat(parttern="###,#")
1.错误消息:
public String testDateTimeFormat(Student student, BindingResult result ,Map<String,Object> map) {
需要验证的数据是 Student中的birthday, SPringMVC要求 如果校验失败 则将错误信息 自动放入 该对象之后紧挨着的 BindingResult中。
即Student student, BindingResult result之间 不能有其他参数。如果要将控制台的错误消息 传到jsp中显示,则可以将 错误消息对象放入request域中,然后 在jsp中 从request中获取。
- 数据校验
JSR303
Hibernate Validator
使用Hibernate Validator步骤:
a.jar(注意各个jar之间可能存在版本不兼容)
hibernate-validator-5.0.0.CR2.jar classmate-0.8.0.jar jboss-logging-3.1.1.GA.jar
validation-api-1.1.0.CR1.jar hibernate-validator-annotation-processor-5.0.0.CR2.jarb配置
<mvc:annotation-driven ></mvc:annotation-driven>
此时mvc:annotation-driven的作用:要实现Hibernate Validator/JSR303 校验(或者其他各种校验),必须实现SpringMVC提供的一个接口:ValidatorFactory
LocalValidatorFactoryBean是ValidatorFactory的一个实现类。
<mvc:annotation-driven ></mvc:annotation-driven>
会在springmvc容器中 自动加载一个LocalValidatorFactoryBean类,因此可以直接实现数据校验。
会在springmvc容器中 自动加载一个LocalValidatorFactoryBean类,因此可以直接实现数据校验。
c.直接使用注解
public class Student {
@Past//当前系统时间以前 private Date birthday ;
}
在校验的Controller中 ,给校验的对象前增加 @Valid public String testDateTimeFormat(@Valid Student student, BindingResult result ,Map<String,Object> map) { {...}
-
3.Ajax请求SpringMVC,并且JSON格式的数据
a.jar
jackson-annotations-2.8.9.jar
jackson-core-2.8.9.jar
jackson-databind-2.8.9.jarb.
@ResponseBody修饰的方法,会将该方法的返回值 以一个json数组的形式返回给前台 @ResponseBody//告诉SpringMVC,此时的返回 不是一个 View页面,而是一个 ajax调用的返回值(Json数组) @RequestMapping(value="testJson") public List<Student> testJson() { //Controller-Service-dao //StudentService studentService = new StudentServiceImp(); // List<Student> students = studentService.qeuryAllStudent(); //模拟调用service的查询操作 List<Student> students = new ArrayList<>(); students.add(stu1) ; students.add(stu2) ; students.add(stu3) ; return students; }
前台:服务端将返回值结果 以json数组的形式 传给了result。
$("#testJson").click(function(){ //通过ajax请求springmvc $.post( "handler/testJson",//服务器地址 //{"name":"zs","age":23} function(result){//服务端处理完毕后的回调函数 List<Student> students, 加上@ResponseBody后, students实质是一个json数组的格式 for(var i=0;i<result.length ;i++){ alert(result[i].id +"-"+result[i].name +"-"+result[i].age); } } );
1.SpringMVC实现文件上传:
和Servlet方式的本质一样,都是通过commons-fileupload.jar和commons-io.jar
SpringMVC可以简化文件上传的代码,但是必须满足条件:实现MultipartResolver接口 ;而该接口的实现类SpringMVC也已经提供了CommonsMultipartResolver具体步骤:(直接使用CommonsMultipartResolver实现上传)
a.jar包
commons-fileupload.jar、commons-io.jar
b.配置CommonsMultipartResolver
将其加入SpringIOC容器<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"></property> <!-- 上传单个文件的最大值,单位Byte;如果-1,表示无限制 --> <property name="maxUploadSize" value="102400"></property> </bean>
c.处理方法
//文件上传处理方法@RequestMapping(value="testUpload") //abc.png public String testUpload(@RequestParam("desc") String desc , @RequestParam("file") MultipartFile file ) throws IOException { System.out.println("文件描述信息:"+desc); //jsp中上传的文件:file InputStream input = file.getInputStream() ;//IO String fileName = file.getOriginalFilename() ; OutputStream out = new FileOutputStream("d:\\"+fileName) ; byte[] bs = new byte[1024]; int len = -1; while(( len = input.read(bs)) !=-1 ) { out.write(bs, 0, len); } out.close(); input.close(); //将file上传到服务器中的 某一个硬盘文件中 System.out.println("上传成功!"); return "success"; }
<form action="handler/testUpload" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> 描述:<input name="desc" type="text" /> <input type="submit" value="上传"> </form>
框架: 将原来自己写的1000行代码,变成:框架帮你写900行,剩下100行自己写
控制器:handler servlet controller action
2.拦截器
拦截器的原理和过滤器相同。
SpringMVC:要想实现拦截器,必须实现一个接口HandlerInterceptor
ctrl+shift+r :自己编写的代码.java .jsp .html
ctrl+shift+t :jar中的代码a.编写拦截器implements HandlerInterceptor
b.配置:将自己写的拦截器 配置到springmvc中(spring)拦截器1拦截请求- 拦截器2拦截请求 - 请求方法 - 拦截器2处理相应-拦截器1处理相应- 只会被 最后一个拦截器的afterCompletion()拦截
如果有多个拦截器,则每个拦截器的preHandle postHandle 都会在相应时机各被触发一次;但是afterCompletion, 只会执行最后一个拦截器的该方法。
3.异常处理
SpringMVC: HandlerExceptionResolver接口,该接口的每个实现类 都是异常的一种处理方式:
a.
ExceptionHandlerExceptionResolver: 主要提供了**@ExceptionHandler**注解,并通过该注解处理异常//该方法 可以捕获本类中 抛出的ArithmeticException异常 @ExceptionHandler({ArithmeticException.class,ArrayIndexOutOfBoundsException.class }) public String handlerArithmeticException(Exception e) { System.out.println(e +"============"); return "error" ; }
@ExceptionHandler标识的方法的参数 必须在异常类型(Throwable或其子类) ,不能包含其他类型的参数
异常处理路径:最短优先
如果有方法抛出一个ArithmeticException异常,而该类有2个对应的异常处理都可以处理:@ExceptionHandler({Exception.class }) public ModelAndView handlerArithmeticException2(Exception e) {} @ExceptionHandler({ArithmeticException.class }) public ModelAndView handlerArithmeticException1(Exception e) {}
则优先级: 最短优先。
@ExceptionHandler默认只能捕获 当前类中的异常方法。
如果发生异常的方法 和处理异常的方法 不在同一个类中:@ControllerAdvice总结:如果一个方法用于处理异常,并且只处理当前类中的异常:@ExceptionHandler
如果一个方法用于处理异常,并且处理所有类中的异常: 类前加@ControllerAdvice、 处理异常的方法前加@ExceptionHandlerb.
ResponseStatusExceptionResolver:自定义异常显示页面 @ResponseStatus@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="数组越界222!!!") public class MyArrayIndexOutofBoundsException extends Exception {//自定义异常 }
@ResponseStatus也可以标志在方法前:
@RequestMapping("testMyException") public String testMyException(@RequestParam("i") Integer i) throws MyArrayIndexOutofBoundsException { if(i == 3) { throw new MyArrayIndexOutofBoundsException();//抛出异常 } return "success" ; } @RequestMapping("testMyException2") public String testMyException2(@RequestParam("i") Integer i) { if(i == 3) { return "redirect:testResponseStatus" ;//跳转到某一个 异常处理方法里 } return "success" ; }
c.异常处理的实现类:
DefaultHandlerExceptionResolver:SPringMVC在一些常见异常的基础上(300 500 405),新增了一些异常,例如:- @see org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
- @see #handleNoSuchRequestHandlingMethod
- @see #handleHttpRequestMethodNotSupported :如果springmvc的处理方法限制为post方式,如果实际请求为get,则会触发此异常显示的页面
- @see #handleHttpMediaTypeNotSupported
- @see #handleMissingServletRequestParameter
- @see #handleServletRequestBindingException
- @see #handleTypeMismatch
- @see #handleHttpMessageNotReadable
- @see #handleHttpMessageNotWritable
- @see #handleMethodArgumentNotValidException
- @see #handleMissingServletRequestParameter
- @see #handleMissingServletRequestPartException
- @see #handleBindException
d.
SimpleMappingExceptionResolver:通过配置来实现异常的处理
<!-- SimpleMappingExceptionResolver:以配置的方式 处理异常 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 如果发生异常,异常对象会被保存在 exceptionAttribute的value值中;并且会放入request域中 ;异常变量的默认值是 exception--> <!--<property name="exceptionAttribute" value="exception"></property>--> <property name="exceptionMappings"> <props> <!-- 相当于catch(ArithmeticException ex){ 跳转:error } --> <prop key="java.lang.ArithmeticException"> error </prop> <prop key="java.lang.NullPointerException"> error </prop> </props> </property> </bean>
SSM整合:
Spring - SpringMVC - MyBatisSpring - MyBatis : 需要整合:将MyBatis的SqlSessionFactory 交给Spring
2
Spring - SpringMVC : 就是将Spring - SpringMVC 各自配置一遍思路:
SqlSessionFactory -> SqlSession ->StudentMapper ->CRUD
可以发现 ,MyBatis最终是通过SqlSessionFactory来操作数据库,
Spring整合MyBatis 其实就是 将MyBatis的SqlSessionFactory 交给SpringS(Spring)M整合步骤:
1.jar
mybatis-spring.jar spring-tx.jar spring-jdbc.jar spring-expression.jar
spring-context-support.jar spring-core.jar spring-context.jar
spring-beans.jar spring-aop.jar spring-web.jar commons-logging.jar
commons-dbcp.jar ojdbc.jar mybatis.jar log4j.jar commons-pool.jar2.类-表
Student类 -student表
3.-(与Spring整合时,conf.xml可省)–MyBatis配置文件conf.xml(数据源、mapper.xml) --可省,将该文件中的配置 全部交由spring管理
spring配置文件 applicationContext.xml
4.通过mapper.xml将 类、表建立映射关系
之前使用MyBatis: conf.xml ->SqlSessionFacotry
现在整合的时候,需要通过Spring管理SqlSessionFacotry ,因此 产生qlSessionFacotry 所需要的数据库信息 不在放入conf.xml 而需要放入spring配置文件中
配置Spring配置文件(applicationContext.xml) (Web项目):
web.xml
监听器必须配置<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
6.使用Spring整合MyBatis :将MyBatis的SqlSessionFactory 交给Spring
7.继续整合SpringMVC:将springmvc加入项目即可
a.加入SpringMVC需要的jar
spring-webmvc.jarb.给项目加入SpringMVC支持
web.xml: dispatcherServletc.编写springmvc配置文件:
applicationContext-controller.xml:视图解析器、基础配置 -
-
SpringMVC常见面试题总结(超详细回答)
2018-07-08 22:51:43简单介绍下你对springMVC的理解? SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,...1、什么是Spring MVC ?简单介绍下你对springMVC的理解?
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
2、SpringMVC的流程?
- (1)用户发送请求至前端控制器DispatcherServlet;
- (2)DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;
- (3)处理器映射器根据请求url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet;
- (4)DispatcherServlet 调用 HandlerAdapter处理器适配器,请求执行Handler;
- (5)HandlerAdapter 经过适配调用 具体处理器进行处理业务逻辑;
- (6)Handler执行完成返回ModelAndView;
- (7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
- (8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
- (9)ViewResolver解析后返回具体View;
- (10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
- (11)DispatcherServlet响应用户。
- 前端控制器 DispatcherServlet:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
- 处理器映射器 HandlerMapping:根据请求的URL来查找Handler
- 处理器适配器 HandlerAdapter:负责执行Handler
- 处理器 Handler:处理器,需要程序员开发
- 视图解析器 ViewResolver:进行视图的解析,根据视图逻辑名将ModelAndView解析成真正的视图(view)
- 视图View:View是一个接口, 它的实现类支持不同的视图类型,如jsp,freemarker,pdf等等
3、Springmvc的优点:
(1)可以支持各种视图技术,而不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) ,请求到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)。
(4) 支持各种请求资源的映射策略。
4、SpringMVC怎么样设定重定向和转发的?
(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
5、 SpringMVC常用的注解有哪些?
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
6、SpingMvc中的控制器的注解一般用哪个?有没有别的注解可以替代?
答:一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。
7、springMVC和struts2的区别有哪些?
(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
8、如何解决POST请求中文乱码问题,GET的又如何处理呢?
(1)解决post请求乱码问题:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<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>
(2)get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
②另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
9、SpringMvc里面拦截器是怎么写的:
有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:
<!-- 配置SpringMvc的拦截器 --> <mvc:interceptors> <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 --> <bean id="myInterceptor" class="com.zwp.action.MyHandlerInterceptor"></bean> <!-- 只针对部分请求拦截 --> <mvc:interceptor> <mvc:mapping path="/modelMap.do" /> <bean class="com.zwp.action.MyHandlerInterceptorAdapter" /> </mvc:interceptor> </mvc:interceptors>
10、注解原理:
注解本质是一个继承了Annotation的特殊接口,其具体实现类是JDK动态代理生成的代理类。我们通过反射获取注解时,返回的也是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法,该方法会从memberValues这个Map中查询出对应的值,而memberValues的来源是Java常量池。
11、SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object、List等,但方法前面要加上@ResponseBody注解。
12、Spring MVC的异常处理 ?
答:可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
13、SpringMvc的控制器是不是单例模式?如果是,有什么问题?怎么解决?
答:是单例模式,在多线程访问的时候有线程安全问题,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。
14、如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
答:可以在@RequestMapping注解里面加上method=RequestMethod.GET。
16、怎样在方法里面得到Request,或者Session?
答:直接在方法的形参中声明request,SpringMvc就自动把request对象传入。
16、如果想在拦截的方法里面得到从前台传入的参数,怎么得到?
答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。
17、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
答:直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面。
18、SpringMvc中函数的返回值是什么?
答:返回值可以有很多类型,有String,ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
19、SpringMvc用什么对象从后台向前台传递数据的?
答:通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前端就可以通过el表达式拿到。
20、怎么样把ModelMap里面的数据放入Session里面?
答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。
相关阅读:
-
springmvc
2020-01-29 21:02:33springmvc.xml SpringMVC的简介和工作流程 SpringMVC常见面试题总结(超详细回答)展开全文 -
【SSM - SpringMVC篇】02 - SpringMVC执行流程详解,SpringMVC三大核心组件和使用,SpringMVC头文件模板
2020-10-14 09:23:471. SpringMVC执行流 1.1 SpringMVC三大核心组件 HandlerMapping处理器映射器:建立地址与方法的映射。 HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式...1. SpringMVC执行流程
1.1 SpringMVC三大核心组件
- HandlerMapping处理器映射器:建立地址与方法的映射。
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- HandlerAdapter处理器适配器:根据地址调用方法。
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
- ViewResolver 视图解析器:处理ModelAndView数据和视图。
ViewResolver通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
1.2 SpringMVC执行流程图
1.3 Spring执行流程具体步骤(参考图)
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
- 执行处理器(Controller层,也叫后端控制器)。
- Controller执行完成返回数据和视图(ModelAndView)。
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体的View视图(JSP / HTML)。
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户,用户看到界面和数据。
1.4 总结流程
Spring MVC所有的请求都经过DispatcherServlet来统一分发。DispatcherServlet将请求分发给Controller之前,需要借助于Spring MVC提供的HandlerMapping定位到具体的Controller。
HandlerMapping接口负责完成客户请求到Controller映射。
Controller接口将处理用户请求,这和Java Servlet扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView(数据和视图)对象给DispatcherServlet前端控制器。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
返回的视图需要通过ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从从而将相应结果渲染给客户。
2. 创建SpringMVC的三大组件
SpringMVC中默认提供的三大组件有可能过时,我们可以手动设置这三大组件,一般只需要设置ViewResolver 视图解析器,设置它的前缀
prefix
和后缀suffix
。2.1 手动一个个的设置处理器映射器(不推荐)
<!--方式1:手动一个个设置 --> <!-- 处理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!--处理器适配器--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
2.2 模型驱动配置处理器映射器和处理器适配器,配置视图解析器【***】
<!--方式2:配置处理器映射器和处理器适配器 --> <!-- 在选择mvc标签时,一定要选择最后的路径是/mvc的选项 --> <!-- 这行配置可以替换掉上边的两行配置(一步步设置) --> <mvc:annotation-driven/> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀和后缀 相当于 //WEB-INF/jsp/Xxx.jsp--> <!--定义页面路径的前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--定义页面路径的后缀--> <property name="suffix" value=".jsp"/> </bean>
2.3【注意】如果
mvc
标签无效,头文件模板。<mvc:annotation-driven/>
无效,可能是头文件不对,下面是一个参考。<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
SpringMVC框架理解
2018-01-26 10:05:24Struts和SpringMVC是Web层的框架,Spring是业务层的框架,Hibernate和MyBatis是持久层的框架。 为什么要使用SpringMVC? 很多应用程序的问题在于处理业务数据的对象和显示业务数据的视图之间存在紧密耦合,通常... -
SpringMVC框架介绍
2018-09-19 17:25:34史上最全最强SpringMVC详细示例实战教程 SpringMVC学习笔记---- 一、SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包。 2.添加Web.xml配置文件中关于SpringMVC的配置 ... -
springboot和springmvc的区别
2019-03-15 22:21:37面试题:你知道springboot和springmvc的区别是什么? 之前自己搭过springboot的相关项目,但是如何进行比较,从自我感觉来看就是使用springboot用起来几乎没有配置,个人搭的项目没有用到配置相关的内容。于是我就... -
Spring+SpringMVC+Mybatis框架整合例子(SSM) 下载
2014-07-21 12:06:07本资源对应博文:http://blog.csdn.net/zhshulin/article/details/37956105,可以通过博文进行学习,不建议下载完整源码,博文有详细教程,以及代码。 -
SpringMVC工作原理
2013-11-25 11:19:08SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置... -
SpringMVC配置
2016-04-27 10:23:46SpringMVC配置项目 -
springMVC精讲
2019-04-27 22:46:38理解MVC设计模式 了解Spring MVC的架构以及请求流程 掌握Spring MVC开发环境搭建 会使用springMVC获取前台数据和灵活的返回结果 -
【SpringMVC学习01】宏观上把握SpringMVC框架
2016-06-18 08:25:11springmvc是一个基于mvc的web框架,是spring框架的一个模块,所以springmvc和spring无需通过中间整合层进行整合。我们先来看下spring的一个架构模型,看springmvc在spring框架中所处的位置: 从图中可以看出,... -
【SSM - SpringMVC篇】01 SpringMVC概述,工作原理,MVC模式,SpringMVC案例
2020-10-13 11:31:10文章目录SpirngMVC介绍MVC模式图解SpringMVC的工作原理图SpringMVC小案例最终效果图1. 环境准备`pom.xml`2. 准备bean对象`Person`3. 用`PersonDb`模拟查询数据4. 核心配置文件`springmvc.xml`5. 配置`web.xml`配置`... -
SpringMVC的简介和工作流程
2019-04-08 17:15:16一、简介 Spring MVC属于SpringFrameWork的...SpringMVC是一种web层的mvc框架,用于替代servlet(处理响应请求,获取表单参数,表单验证等) 二、工作流程 1、用户发送请求至前端控制器DispatcherServlet。... -
springmvc笔记
2020-09-05 10:25:54【2】springmvc配置文件 【3】springmvc 转发与重定向 【1】HiddenHttpMethodFilter与HttpPutFormContentFilter HiddenHttpMethodFilter 作用: 浏览器端的form表单只支持GET与POST这两个值,而不支持DELETE、PUT... -
SpringMVC Controller单例和多例
2017-03-29 03:28:47对于SpringMVC Controller单例和多例,下面举了个例子说明下. 第一次:类是多例,一个普通属性和一个静态属性。 结果:普通属性:0.............静态属性:0 普通属性:0.............静态属性:1 普通属性:0...... -
走进SpringMVC世界,从SpringMVC入门到SpringMVC架构
2019-07-30 15:18:12文章目录1.Springmvc入门1.1.Springmvc是什么1.2.Springmvc处理流程1.3.入门程序1.3.1.创建web工程1.3.2.导入jar包1.3.3.加入配置文件1.3.3.1.创建springmvc.xml1.3.3.2.springmvc.xml中配置处理器适配器... -
SpringMVC+Hibernate+Spring整合实例
2013-05-31 15:49:34SpringMVC+Hibernate+Spring整合实例源码下载,很完整的例子,需要的可以下载源码学习 -
SpringMVC框架第一谈(SpringMVC简介优点、第一个SpringMVC的程序、SpringMVC的执行流程)
2020-06-13 23:53:35SpringMVC的简介以及优点 SpringMVC 简介 SpringMVC 也叫 Spring web mvc。是 Spring 框架的一部分,是在 Spring3.0 后发布的。 SpringMVC 优点 基于 MVC 架构 基于 MVC 架构,功能分工明确。解耦合, 容易理解,... -
SpringMVC快速入门第一讲——SpringMVC介绍与入门
2017-05-15 22:50:55SpringMVC介绍SpringMVC是什么?SpringMVC和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来: SpringMVC处理流程SpringMVC处理流程如下图所示: 这个图大致描述了... -
spring和springMVC的面试问题总结
2017-08-30 10:44:251.Spring中AOP的应用场景、Aop原理、好处? 答:AOP--Aspect Oriented Programming面向切面编程;用来封装横切关注点,具体可以在下面的场景中使用: Authentication 权限、Caching 缓存、Context passing 内容传递... -
springMVC介绍
2021-01-16 12:30:50springMVC简介 springMVC又 叫Spring web mvc。是Spring框架中的一部分,是Spring3.0后发布的。 SpringMVC框架的优点 1、基于MVC架构模式:MVC架构模式 2、容易理解上手快,使用简单:可以开发一个注解的... -
2 SpringMVC
2020-11-19 09:07:5002SpringMVC-1. SpringMVC概述* 02SpringMVC-2. SpringMVC基于XML的环境搭建* 02SpringMVC-3. SpringMVC基于Servlet3. 0规范的纯注解环境搭建* 02SpringMVC-4. 纯注解环境搭建的入门案例执行过程分析* 02SpringMVC-5... -
SpringMVC学习
2019-04-10 10:59:10【SpringMVC学习01】宏观上把握SpringMVC框架【SpringMVC学习02】走进SpringMVC的世界【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结【SpringMVC学习04】Spring、MyBatis和SpringMVC的整合... -
SpringMvc面试题
2016-07-18 20:04:35讲下SpringMvc和Struts1,Struts2的比较的优势 性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差不多,比Struts1要高 f-sm-2. 讲下SpringMvc的核心入口类是什么,Struts1,Struts2... -
SpringMvc Interceptor拦截器的配置与使用
2018-02-28 17:40:21package com.springmvc.controller; import com.springmvc.entity.User; import com.springmvc.service.UserService; import org.apache.commons.collections.map.HashedMap; import org.apache.log4j.Logger; impo... -
SpringMVC入门
2020-01-11 11:41:23我们先来说一下什么事SpringMVC?有什么作用? springMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等 了解SpringMVC的核心组件 DispatcherServlet:前置控制器 HandlerMaper:...
-
中文版Maxwell仿真实例PDF.pdf
-
【2021】UI自动化测试Selenium3
-
clickhouse-common-static-dbg-20.9.2.20-2.x86_64.zip.001
-
解决中国大学排名定向爬虫报错
-
web前端开发规范
-
jdk-8u191-linux-x64.tar
-
智能车安装接线说明哦
-
什么是EN50155?什么产品需要做EN50155?
-
阿里云云计算ACP考试必备教程
-
2021年1月19日 接口测试范围
-
2021-01-19
-
widget.cpp
-
单元测试UnitTest+Pytest【Selenium3】
-
三维地图GIS大数据可视化
-
FundaPaul_ICRA1998_quaternions.pdf
-
外贸公司怎么做开发信,什么企业邮箱更适合发开发信呢?
-
一个基于QQ登录的案例
-
【2021】Python3+Selenium3自动化测试(不含框架)
-
aws自动化运维(弹性伸缩)步骤.pdf
-
AWS-WAF挂载ALB.docx