1.复习Servlet
新建一个maven项目总,导入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
新建一个子mavean项目,将其变为Web项目
右击子项目
勾选后选中版本为4.0
新建com.lwh.servlet包,创建servlet
package com.lwh.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method=req.getParameter("method");
if("add".equals(method)){
req.getSession().setAttribute("method","该操作为add方式");
}else if("delete".equals(method)){
req.getSession().setAttribute("method","该操作为delete方式");
}else{
req.getSession().setAttribute("method","无参数");
}
req.getRequestDispatcher("/WEB-INF/hello.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
配置servlet
到web.xml中可以配置servlet的路径,如果不配置就会找不到路径,也可以用注解进行注册(快捷方式),但是当项目够大是xml方式个人认为较好
<?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-mapping标签一般成对出现-->
<!-- <servlet>-->
<!-- <servlet-name>自定义的servlet名字,在servlet-mapping的name中需要再次出现</servlet-name>-->
<!-- <servlet-class>servlet的具体位置,由包名一个一个的往下找</servlet-class>-->
<!-- </servlet>-->
<!-- <servlet-mapping>-->
<!-- <servlet-name>servlet的servlet-name的属性值</servlet-name>-->
<!-- <url-pattern>访问路径,例如下面的这个例子,就是项目/hello</url-pattern>-->
<!-- </servlet-mapping>-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.lwh.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
在WEB-INF下创建我们需要跳转的hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--下面这个是jsp的el表达式,表示取出session容器中的名字叫做method的对象-->
${method}
</body>
</html>
访问
2.新建一个SpringMVC
SpringMVC特点:
- 轻量级,简单易学
- 高效,基于请求响应的MVC框架
- 与Spring兼容性好
- 约定优于配置
- 功能强大:RESTful,数据验证,格式化,本地化,主题等
- 简介灵活
创建一个SpringMVC工程大概分为以下几步:
- 导依赖
- 创建spring-mvc配置文件
- 在web.xml中配置DispatcherServlet
- 编写Controller
- 访问
先创建一个视图(jsp)
如下:hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>huaye</title>
</head>
<body>
<!--el表达式,可以将session中的msg值显示到页面中-->
${msg}
</body>
</html>
导依赖
项目pom.xml中导入
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
创建spring-mvc配置文件
<?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
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--包扫描,代表com.lwh.controller包下的才是真正的控制器-->
<context:component-scan base-package="com.lwh.controller"/>
<!--默认的handler-->
<mvc:default-servlet-handler />
<!--注解的支持-->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
web.xml中配置DispatcherServlet
这基本上是一个固定的写法,可变性不高,文末会讲讲这个DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
先讲讲这个标签信息:
servlet-class就是代表这个servlet的路径是标签内的值,dispaterServlet是springmvc中内置的一个servlet,对springmvc来说十分重要
init-param就是代表配置信息,value中就是配置的xml文件
编写Controller
在配置文件中已经写了参数,控制器在com.lwh.controller下才生效,所以,我们需要在这个包下创建一个类,暂时命名为HelloController
package com.lwh.controller;
import com.sun.org.apache.xpath.internal.operations.Mod;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model){
model.addAttribute("msg","Hello,SpringMVC");
return "hello";
}
}
- 在类上添加注解@Controller,代表这个是一个Controller
- 在方法上添加注解@RequestMapping,代表这个是一个请求映射,通俗来讲就是当访问 localhost:8080/SpringMVC3/hello 时执行被 @RequestMapping("/hello") 注解的方法体
- 这里的 return “hello” 代表当访问/hello路径时;执行方法体,先将设置session中的msg值为Hello,SpringMVC,然后访问转到hello.jsp。
为什么方法明明返回的是一个String类型的hello,却会转到hello.jsp?
访问
第一个SpringMVC程序完成!
项目目录
3.谈谈我们干了什么
配置文件中我们配置了
Controller的路径,handler,以及注解支持
这三个基本上可以作为一个定式,每个springMVC项目都这么写就可以,重要的是这个视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
可以这样理解,当我们访问视图时,会自动加上前缀和后缀,前缀是:"/WEB-INF/jsp/";后缀是:".jsp";这就是为什么我们访问hello时直接就能找到WEB-INF下的jsp下的hello.jsp文件。
@Controller这个注解代表这个是一个控制器,里面的方法提供映射路径,可以理解为SpringMVC的一个标志
@RequestMapping这个注解代表这是一个映射器,里面的值代表访问路径,只要访问路径与@RequestMapping注解中的值匹配成功,就执行方法