目录
一、框架介绍
两个重要的xml文件
SpringMVC执行流程
二、Vscode搭建SpringMVC框架
1、maven创建webapp原型项目
2、pom.xml下添加springmvc的相关依赖
3、在web.xml配置
4、springmvc.xml的配置
5、编写Controller控制器类
6、 编写JSP界面
7、项目结构图
一、框架介绍
两个重要的xml文件
web.xml文件是Java Web应用程序的部署描述文件,用于配置Web应用程序的部署信息和配置参数。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>spring_mvc</display-name>
<!-- springMVC的前端控制器,此处为名称显示在Web服务器管理页面的 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 如果以xxx-servlet.xml命名,并且位于/WEB-INF下,则服务器会自动识别,
不需要配置 init-param-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--init-param配置是告诉服务器DispatcherServlet的配置文件在哪,
此处是告诉服务器文件在src/classes下去找该配置文件 -->
<load-on-startup>1</load-on-startup><!-- 立即加载 -->
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 此处为url匹配器,这里/表示处理所有请求,可以设置一些固定格式,
来过滤非法请求。 -->
</web-app>
springmvc.xml文件,该文件是springmvc的配置文件。该文件的名称可以自定,文件位置甚至可以放在任意位置,但这样做就要在web.xml配置相关文件信息和文件位置。
具体配置方法:要配置init-param元素,param-value值就要修改为相对于web.xml所在的路径。上面web.xml的param-value值,说明DispatcherServlet的配置文件位于/项目名/src/resources目录下,此目录一般放java代码,打包后会该配置文件会存在于\项目名\WEB-INF\classes的目录下。
如果不想配置init-param元素,则要将springmvc的配置文件命名为xxx-servlet.xml,并且文件位于WEB-INF文件夹下。
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 配置controller -->
<bean id="login" name="/loginController" class="com.hfxt.controller.LoginController"></bean>
<!-- 配置映射处理器 :name来映射寻找controller (默认存在,可以省略不配置,如果用到另外两种需要配置) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 根据控制器返回的字符串拼接成jsp路径:/WEB-INF/page/xx.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/page/"/><!-- 前缀 -->
<property name="suffix" value=".jsp"/><!-- 后缀 -->
</bean>
</beans>
SpringMVC执行流程
01、用户发送url请求到前端控制器DispatcherServlet拦截进行处理。
以下是具体的DispatcherServlet前端拦截器配置,DispatcherServlet的配置文件可以放在项目的任意目录,
在web.xml文件下配置:
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>该语句配置了Spring MVC框架中的DispatcherServlet。
其中org.springframework.web.servlet.DispatcherServlet是DispatcherServlet的类路径。
02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
HandlerMapping的实现一共有多种。以下BeanNameUrlHandlerMapping是Spring MVC 框架中最简单的通过name映射寻找controller的 HandlerMapping 实现。
在springmvc.xml文件里配置:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置映射处理器 :name来映射寻找controller (默认存在,可以省略不配置,如果用到另外两种需要配置) -->
HandlerMapping的实现方式还有
SimpleUrlHandlerMapping、ControllerClassNameHandlerMapping等
03、HandlerMapping找到具体的处理器Handler(查找XML配置或注解配置),返回执行链。
XML配置:在springmvc.xml文件里进行相关Controller类的配置
<bean id="login" name="/loginController" class="com.hfxt.controller.LoginController"></bean>
注释配置:在Controller类中使用@Controller
和@RequestMapping
等注解来指定请求路径与处理方法的映射关系。Spring框架会扫描这些注解,并根据它们建立映射关系,从而将请求路由到相应的Controller处理方法上。
@Controller
@RequestMapping("/example")
public class ExampleController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "helloPage";
}
}
04、HandlerAdapter(处理器适配器)经过适配调用具体的处理器(Handler/Controller)
HandlerAdapter适配器会找到合适的方法调用处理器Handler(因为Handler的定义方式不止一种)
05、Controller执行完成返回ModelAndView对象。
06、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
07、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
ViewReslover具体要在springmvc的配置文件里进行如下语句的具体配置,设置前缀和后缀。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/page/"/><!-- 前缀 --> <property name="suffix" value=".jsp"/><!-- 后缀 --> </bean>
08、ViewReslover解析ModelAndView后返回具体View(视图)给DispatcherServlet。
09、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中),再响应给用户。
二、Vscode搭建SpringMVC框架
1、maven创建webapp原型项目
参考:http://t.csdnimg.cn/fg98g
resources的lib文件夹放相关jar包
java文件夹下放相关java代码
2、pom.xml下添加springmvc的相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.30</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
只有添加完相关依赖(相当于引入相关jar包)后,才能配置springmvc。
3、在web.xml配置
一、配置拦截器DispatcherServlet
<servlet-name>myspringmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
二、配置springmvc配置文件的地址
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc.xml</param-value>
</init-param>
三、配置servlet映射
<servlet-mapping>
<servlet-name>myspringmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
四、配置欢迎界面
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
最终配置代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>spring_mvc</display-name>
<!-- springMVC的前端控制器 -->
<servlet>
<servlet-name>myspringmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--init-param配置文件的位置 如果springmvc.xml是以xxx-servlet.xml命名,并且位于/WEB-INF下则不需要配置 -->
<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>myspringmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4、springmvc.xml的配置
我们在web.xml文件下配置了springmvc.xml的路径。该文件位于以下文件夹(resources)下。也可以自定目录,根目录从web项目起。
在配置springmvc之前,我们要生成其xml文件,eclipse可以通过可视化自动生成,而在vscode中我们可以手动创建并导入版本约束和命名空间。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
</beans>
然后我们就能在beans标签里配置具体内容。
一、配置映射处理器
常见的映射处理器有:BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping、ControllerClassNameHandlerMapping等。
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
二、配置视图解析器 :
用于将控制器返回的字符串拼接成可访问的url路径(前提是真实存在)。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
三、配置包扫描器:用于组件的自动发现和自动装配。
<context:component-scan base-package="com.edu"/>
<mvc:annotation-driven/>
<!--启用对处理mvc注解的支持-->
最终配置代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 配置controller
<bean id="login" name="/loginController" class="com.hfxt.controller.LoginController"></bean> -->
<!-- 1、配置映射处理器 :name来映射寻找controller (默认存在,可以省略不配置,如果用到另外两种需要配置) -->
<context:component-scan base-package="com.edu"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/page/"/>
<property name="suffix" value=".html"/>
</bean>
</beans>
5、编写Controller控制器类
在java文件下创建包,并编写控制器类Controller,此类继承了抽象类AbstractController,覆写其方法。
package com.edu;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
@Controller
public class Calculate extends AbstractController {
@RequestMapping("/calculate")
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
ModelAndView mav=new ModelAndView();
String x="";
for(int i=1;i<=5;i++){
String t=req.getParameter(Integer.toString(i));
x+=t;
}
Integer result= count(x);
System.out.println(result);
mav.setViewName("result");
mav.addObject("result", result);
return mav;
}
protected Integer count(String x){
String ture_result="ACCBD";
Integer cnt=0;
for(int i=0;i<x.length();i++){
if(ture_result.charAt(i)==x.charAt(i)){
cnt++;
}
}
return cnt*20;
}
}
6、 编写JSP界面
JSP的页面文件放在webapp的文件夹下 。
result.jsp
使用el表达式提取ModelAndView传递的值。
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<h1 color="red">您本次的测试成绩为:${result}分</h1>
</body>
</html>
index.jsp
用表单属性action发送数据到/examination/calculate上。
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>C语言考试</title>
</head>
<body>
<form action="/examination/calculate" method="post">
<p>1、以下哪个是C语言整形数据类型</p>
<p>
<input name="1" type="radio" value="A" />A、int
<input name="1" type="radio" value="B" />B、char
<input name="1" type="radio" value="C" />C、float
<input name="1" type="radio" value="D" />D、double
</p>
<p>2、以下哪个是C语言浮点型数据类型</p>
<p>
<input name="2" type="radio" value="A" />A、int
<input name="2" type="radio" value="B" />B、char
<input name="2" type="radio" value="C" />C、float
<input name="2" type="radio" value="D" />D、double
</p>
<p>3、以下哪个是C语言中格式正确的标识符</p>
<p>
<input name="3" type="radio" value="A" />A、int
<input name="3" type="radio" value="B" />B、1ch
<input name="3" type="radio" value="C" />C、word
<input name="3" type="radio" value="D" />D、()!@#¥
</p>
<p>4、以下哪个是C语言的文件后缀</p>
<p>
<input name="4" type="radio" value="A" />A、.c
<input name="4" type="radio" value="B" />B、.cpp
<input name="4" type="radio" value="C" />C、.java
<input name="4" type="radio" value="D" />D、.py
</p>
<p>5、以下哪个是C语言中的一维数组</p>
<p>
<input name="5" type="radio" value="A" />A、int a;
<input name="5" type="radio" value="B" />B、chara;
<input name="5" type="radio" value="C" />C、float a [] [] ;
<input name="5" type="radio" value="D" />D、double a [] ;
</p>
<input type="submit"/>
</form>
</body>
</html>