JavaWeb 笔记

1. 配置

web.xml配置Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
<context-param>
<param-name>ContextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>

<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>

Spring MVC配置步骤

1. 新建一个Module,添加Web支持

2. 确定导入了SpringMVC的依赖

3. 配置web.xml, 注册DispatcherServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 关联一个SpringMVC的配置文件:[servlet-name]-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动级别:1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- / 表示匹配所有的请求,(不包括.jsp) -->
<!-- * 表示匹配所有的请求,(包括.jsp) -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

4. 编写SpringMVC的配置文件!名称:springmvc-servlet.xml,这里的名称要求是按照官方来的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">


<!-- 处理器映射器 HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 处理器适配器 HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>

<!-- Handler -->
<bean id="/hello" class="cn.geekhall.controller.HelloController"/>

</beans>

5. SpringMVC配置文件中添加处理器映射器

1
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

6. SpringMVC配置文件中添加处理器适配器

1
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

7. SpringMVC配置文件中添加视图解析器

1
2
3
4
5
6
7
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>

8. 编写我们要去操作业务的Controller,要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,装数据,封视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cn.geekhall.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ModelAndView 视图
ModelAndView mv = new ModelAndView();

// 封装对象,放在ModelAndView中,Model
mv.addObject("msg", "HelloSpringMVC!");

// 封装要跳转的视图,放在ModelAndView。
mv.setViewName("hello"); // : /WEB-INF/jsp/hello.jsp
return mv;
}
}


9. 将自己的类交给SpringIOC容器,注册bean

1
2
<!-- Handler -->
<bean id="/hello" class="cn.geekhall.controller.HelloController"/>

10. 编写要跳转的jsp页面,显示ModelandView存放的数据,以及我们的正常页面

hello.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>

${msg}

</body>
</html>


11. 配置Tomcat启动测试

SpringMVC的执行流程

  1. 解析URL
    • 我们假设请求的url为:http://localhost:8080/SpringMVC/hello
    • 如上url拆分成三部分:
      • localhost:8080 表示服务器域名
      • SpringMVC表示部署在服务器上的web站点
      • hello表示控制器
    • 通过分析,如上URL表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello 控制器。
  2. HandleMapping为处理器映射器,DispatcherServlet调用HandlerMapping,HandlerMapping根据请求URL查找Handler。
  3. HandlerExecution表示具体的Handler,其主要作用是根据URL查找控制器,如上URL被查找控制器为:hello。
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  6. Handler让具体的Controller执行。
  7. Controller将具体的执行信息封装在ModelAndView中返回给HandlerAdapter。
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  9. DispatcherServlet调用视图解析起(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  12. 最终视图呈现给用户。

注解方式

1
2
3
4
@Component      组件
@Service service
@Controller controller
@Repository dao

改了Java代码 => 重新发布
改了配置文件 => 需要Reload
改了前端页面 => 刷新浏览器即可

方法级别的注解变体有如下几个:组合注解

1
2
3
4
5
6
7
@GetMapping
等价于@RequestMapping(method=RequestMethod.GET)
@PostMapping
等价于@RequestMapping(method=RequestMethod.POST),下同
@PutMapping
@DeleteMapping
@PatchMapping

json

  • JSON字符串转换为JavaScript对象:
1
2
var obj = JSON.parse('{"a": "Hello", "b": "Json"}');

  • JavaScript 对象转换为Json字符串:
1
var json = JSON.stringify({a: 'Hello', b:'Json'});

SpringMVC 处理拦截器

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,开发者可以自己定义一些拦截器来实现特定的功能。

  • 过滤器
    • servlet规范中的一部分,任何java web工程都可以使用。
    • 在url-pattern中配置了/* 之后,可以对所有要访问的资源进行拦截。
  • 拦截器
    • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用。
    • 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的。

拦截器是AOP思想的具体实现。

如何实现拦截器

想要自定义拦截器,必须实现HandlerInterceptor接口。