springmvc-首页访问

jar包依赖

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.16</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>

web.xml

<!--    配置springmvc前端控制器,对浏览器发送的请求统一处理-->
<servlet>
<servlet-name>springmvcdemo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springmvc的配置文件的 位置 和 名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!-- 将前端控制器dispatcherServlet的初始化时间 提前到 服务器 启动时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvcdemo</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

springMVC.xml配置

<!--    配置组件扫描-->
<context:component-scan base-package="com.miao.controller"></context:component-scan>

<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<!-- 优先级-->
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">

<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>

<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>

image-20230113224159435

访问页面

image-20230113224300540

image-20230113224345859

web.xml

image-20230113234030012

webapp

image-20230113234217084

@requestmapping-value

alt + 7 查看 structure

image-20230113233341039

@AliasFor("path")
String[] value() default {};

可以多个地址访问同一个页面

image-20230113233533511

@requestmapping-method

image-20230114211252444

image-20230114211337442

多个请求方法方式

image-20230114211426381

image-20230114211442497

@requestmapping-params

请求路径携带参数

image-20230114214056770

image-20230114214151474

image-20230114214215905

@PathVariable

image-20230114221014721

image-20230114221130138

原生servletapi 调用

image-20230114223528458

image-20230114223543121

@RequestParam

image-20230114231224995

image-20230114231444986

image-20230114231510258

结果

image-20230114231728626

image-20230114231746593

域对象共享数据

servletAPI共享数据

image-20230115222655501

image-20230115222728473

image-20230115222749336

modelandview共享数据

image-20230115224038290

model

image-20230115224548448

map

image-20230115224926312

modelmap

image-20230115225231065

model–modelmap–map关系

modelmap

image-20230115230257361

model

image-20230115230334369

map

image-20230115230507698

实现

image-20230115230707024

dispatcherServlet流程

image-20230116212849754

image-20230116213018836

对应

image-20230116213123787

image-20230116213152130

springMVC的视图

thymeleaf解析器

dispatcherservlet–processdispatchresult–render

image-20230116222735554

forward转发–地址不变

执行

image-20230116230641339

第一次请求

image-20230116230546898

第二次请求

image-20230116230724865

redirect重定向–两次请求

image-20230117191558260

view-controller

mvc中用来制定首页

<!--    path:设置处理的 请求地址,view-name:请求地址对应的视图名称-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!-- 开启注解驱动-->
<mvc:annotation-driven/>

restful中的请求方式

image-20230118105838378

image-20230118105900436

image-20230118111026373

开放对静态资源的访问

对静态资源的访问

先是dispatcherservlet寻找–若找不到,交给默认的defaultservlet找

image-20230118120719630

httpMessageConverter–报文信息转换

提供了两个注解和类型

  • @requestbody———requestentity
  • @responsebody———–responseentity

将请求报文转换为java对象

将java对象转换为响应报文

@responsebody

不走视图,返回字符-succes-

image-20230118151750870

json–返回对象

image-20230118153859957

image-20230118153912516

拦截器的配置

springMVC中的拦截器用于dispatcherservlet

  • prehandle:控制器方法执行之前执行,返回类型boolean,返回true放行,false表示拦截
  • posthandle:控制器方法执行之后执行
  • aftercomplation:处理完视图和模型视图,渲染视图后执行

拦截器配置

//配置拦截器
@Component
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("prehandler");
return HandlerInterceptor.super.preHandle(request, response, handler);
// return false;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}

@Component
public class SecondInterceptor implements HandlerInterceptor {。。。。}

springmvc.xml配置

<!--    配置拦截器_三种方式-->
<mvc:interceptors>
<!-- <bean class="com.miao.controller.interceptor.FirstInterceptor"></bean>-->
<!-- <ref bean="firstInterceptor"></ref>-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>
</mvc:interceptors>

三个拦截方法

image-20230118220905447

prehandle

控制器之前执行–按照遍历的顺序

image-20230118220321525

posthandle

控制器之后执行–遍历–倒叙执行

image-20230118220550056

aftercomplation

渲染视图之后执行–遍历–倒叙执行

image-20230118221018752

基于配置异常处理

显示结果

image-20230118224005803

image-20230118224039715

xml中配置

image-20230118224126916

基于注解配置异常处理

image-20230118225054965

image-20230118225108188

注解配置springmvc

用于替换springmvc.xml

/**
* 组件扫描 thymeleaf视图解析器 首页跳转view-controller 静态资源访问default-servlet-handler
* 注解驱动annotation-driven SimpleMappingExceptionResolver异常处理
*/
//标识为配置类
@Configuration
//开启组件扫描
@ComponentScan("com.miao.mvc")
//开区注解驱动
@EnableWebMvc
public class Webconfig implements WebMvcConfigurer {

//替换springmvc.xml中的视图解析
//配置生成模板解析器
@Bean
public ITemplateResolver contextTemplateResolver(){
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContextTemplateResolver contextTemplateResolver = new ServletContextTemplateResolver(
webApplicationContext.getServletContext()
);
contextTemplateResolver.setPrefix("/WEB-INF/templates/");
contextTemplateResolver.setSuffix(".html");
contextTemplateResolver.setCharacterEncoding("UTF-8");
contextTemplateResolver.setTemplateMode(TemplateMode.HTML);
return contextTemplateResolver;
}
//生成模板引擎 并为 模板引擎 注入模板解析器
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver contextTemplateResolver){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(contextTemplateResolver);
return templateEngine;
}
//生成视图解析器 并为 解析器注入 模板引擎
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine){
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}

//静态资源访问default-servlet-handler
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

//配置拦截器 /*:拦截一层 /**:拦截所有层
@Override
public void addInterceptors(InterceptorRegistry registry) {
TestInterceptor testInterceptor = new TestInterceptor();
registry.addInterceptor(testInterceptor).addPathPatterns("/**");
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/hello").setViewName("hello");
}
//文件上传
// @Bean
// public MultipartResolver multipartResolver(){
// CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
// return commonsMultipartResolver;
// }
//异常处理java.lang.ArithmeticException
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
properties.setProperty("java.lang.ArithmeticException","error");
simpleMappingExceptionResolver.setExceptionMappings(properties);
simpleMappingExceptionResolver.setExceptionAttribute("ex");
resolvers.add(simpleMappingExceptionResolver);
}
}

用来替代web.xml

//web工程的初始化,用来代替web.xml
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
//spring的配置类
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
//springmvc 的配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{Webconfig.class};
}

//dispatcherservlet的映射规则 url-pattern
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}

//配置过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceResponseEncoding(true);
HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
return new Filter[]{encodingFilter,methodFilter};
}
}

dispatcherservlet–关系

image-20230119140850907