SpringMVC
回顾MVC
回想一下什么是MVC?曾今在web阶段,我们第一次接触到了MVC。
MVC:模型(dao、service)、视图(jsp)、控制器(servlet)
MVC是一种架构模式,是一种规范,它将代码的工作职责划分的很清晰。
回顾Servlet
我们先写一个基础的web时代的小程序来唤醒久远的记忆。
首先导入一会要用的一些依赖
1.Spring-MVC常用依赖
<!--导入的依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2-rev-1</version>
</dependency>
</dependencies>
然后我们需要构建web框架支持,在项目右键添加架构支持就好了
想想下一步,我们需要写一个继承了HttpServlet的java类,来作为我们的servlet
2.Servlet
只要实现了Servlet接口的类,就是一个Servlet
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取前端封装的数据
String method = req.getParameter("method");
if (method.equals("add")){
req.getSession().setAttribute("msg","执行了add方法");
}else if (method.equals("delete")){
req.getSession().setAttribute("msg","执行了delete方法");
}
//2.调用业务层
//3.视图转发或者重定向
req.getRequestDispatcher("/hello.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在这个Servlet中,我们之前需要做三个步骤:
- 获取前端数据,并做不同的处理
- 调用业务层
- 视图转发或者重定向
由于这个小程序里我们没写业务层,所以我们只实现1和3就好了。
我们需要从前端获得名字位“method”的参数,并将其封装为字符串,对字符串进行比较后,做不同的处理判断,比如向seession内放入名为msg的参数
现在我们已将做完处理,现在只需要做转发或者重定向就好了。
3.重定向与转发
先让我们回忆一下什么是转发什么是重定向:
- 转发(forward):转发是服务器行为,客户是感受不到服务器做了转发的,同时转发能够携带一次数据(req,resp),转发的请求只有一次,而且他的地址栏也不会改变
- 重定向(sendRedirect):相比起来重定向有点捞,重定向是客户端行为,所以相当于进行了两次请求,地址栏也会改变,而且由于是浏览器重新发出了请求,就没有什么request传递的概念了。
两者的区别:
- 是服务器行为还是客户端行为
- 用户能否感受到
- 能否携带数据
- 请求次数
- 地址栏是否会改变
转发是服务器行为,重定向是客户端行为
4.配置Servlet
接下来我们就可以去写xml文件配置servlet了
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.zhaox.servlet.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
另外我们也可以在这里设置session超时和欢迎页之类的。
5.写JSP
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
welcome
<form action="/hello" method="get">
<input type="text" name="method">
<input type="submit" name="提交">
</form>
</body>
</html>
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
这里复习一下jsp的知识,首先进入index.jsp页面,随后利用form表单提交到/hello(xml里注册的servlet),设置提交方式为get。
内部设置一个text和一个提交按钮,将text的名字设置为method
这样后台servlet就可以提取名为method的参数,并且根据参数进行不同操作
接下来是跳转的hello.jsp
这里用一下EL表达式,取得后端获得的msg参数
HelloSpringMVC
首先,我们要先知道为什么要学SpringMVC呢
SpringMVC的特点:
- 轻量级,简单
- 不需要太多依赖
- 高效,基于请求和响应的MVC框架
- 与Spring无缝结合
- 约定大于配置
- 功能强大:RESTful,数据验证,格式化,本地化,主题等
当然最重要的还是用的人多哈哈哈哈哈哈
Spring的web框架围绕DispatcherServlet来实现,DispatcherServlet的作用就是将请求分发到不同的处理器(Servlet)。
想想以前我们写的servlet开发的时候,我们要经过servlet,service,dao最终到达数据库来完成一个事件。
但是如果我们需要的交互操作比较多,可能就需要创建成批的Servlet,用户也需要去调用许多不同的Servlet,看起来复杂又麻烦。
在架构里没有什么是加一层不能解决的
我们可以增加一个DispatcherServlet来解决这些问题
当然,配置地狱嘛,你懂的
来人,上配置!
- web.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"> <!--1.注册DispatcherServlet--> <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>
- springmvc-servlet.xml
<?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"> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--视图解析器:DispatcherServlet给他的ModelAndView--> <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="com.zhaox.controller.HelloController"/> </beans>
接下来我们来写对应的控制层
//注意:这里我们先导入Controller接口
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;
}
}
然后是视图层!
- hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>zhaox</title> </head> <body> ${msg} </body> </html>
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> welcome <form action="/hello" method="get"> <input type="text" name="method"> <input type="submit" name="提交"> </form> </body> </html>
Comments | NOTHING