IDEA+maven+SpringMVC配置简单web项目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/82771858

前言:

刚接触SpringMVC讲真的,看理论真的是一头雾水,不如实打实手撕一个简单Demo学得快。

这里我就不多介绍为何要如此配置了,因为网上理论的知识太多了,我也相信你只是缺少一个简单的说明例子。

这里我就简单用SpringMVC配置一个小项目
来理解一下SpringMVC到底是什么妖怪。


主页面显示:

http://localhost:8080/SpringMVC_test/

在这里插入图片描述

水果信息页面显示:

http://localhost:8080/SpringMVC_test/fruits.action

在这里插入图片描述
首先附上项目的git地址:有兴趣的可以直接下载:

https://github.com/jjc123/SpringMVC_MyfirstDemo

首先看一下目录结构:

在这里插入图片描述

第一步配置pom.xml:

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.0.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.8.RELEASE</version>
    </dependency>
    <!--配置servlet依赖   Controller处理器需要-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
      <!--配置jstl标签需要-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  </dependencies>

第二步:配置web.xml:

主要是配置DispatcherServlet这个中间类:和Model,View,Controller分别进行联系,降低三者的耦合度。
注意:

 web.xml中<welcome-file-list>配置((web欢迎页、首页))
在web项目中,当用户在浏览器中输入的URL不包含某个特定的  
Servlet、html、jsp页面时,  
web.xml中<welcome-file-list>标签元素就会指定显示的默认文件。

SpringMVC中JSP页面不显示EL表达式的原因:
EL表达式默认是禁用或者忽略的, 必须手动启用,才会输出 model 中的值。

web-app所以要用version大于3的版本

<?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">
    <display-name>Archetype Created Web Application</display-name>
    <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/springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

第三步:配置实体类:

这里省略set和get方法,其实是存在的

public class Fruit {

    String name;
    Integer price;

    public Fruit(){}
    public Fruit(String name, Integer price) {
        this.name = name;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Fruit{" +
                "name='" + name + '\'' +
                ", price='" + price + '\'' +
                '}';
    }
}

第四步:配置实现Controller接口的类:

import java.util.ArrayList;
import java.util.List;

public class FruitsController implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        FruitService fruitService = new FruitService();
        List<Fruit> list = fruitService.queryFruitsList();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("fruits",list);

        System.out.println(modelAndView.getModelMap());
        modelAndView.setViewName("/WEB-INF/jsp/fruitsList.jsp");
        return modelAndView;
    }
    class FruitService{
        public List<Fruit> queryFruitsList(){
            List<Fruit> list = new ArrayList<Fruit>();
            list.add(new Fruit("苹果",5));
            list.add(new Fruit("火龙果",7));
            list.add(new Fruit("雪莲果",4));
            return list;
        }
    }
}

第五步:配置要访问的显示界面jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>新鲜水果</h3>
<table width="300px" border="1">
    <tr>
        <td>序号</td>
        <td>名称</td>
        <td>价格</td>
    </tr>
    <c:forEach items="${fruits}" var="fruit" varStatus="varfrt">
        <tr>
            <td>${varfrt.count}</td>
            <td>${fruit.name}</td>
            <td>${fruit.price}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

第六步:配置欢迎界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>欢迎 !</h2>
</body>
</html>

最后一步:配置springmvc.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的name作为url进行查找,需要配置Handler时指定Beanname就是url-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <!--配置适配器 只要编写了实现了Controller接口的控制器,适配器就会执行Controller的具体方法-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <!--根据handler方法返回的modelandview中的视图的具体位置,加载相应的界面并绑定反馈数据-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

    <bean name="/fruits.action" class="controller.FruitsController"></bean>
</beans>

流程:

  1. 因为http://localhost:8080/SpringMVC_test/不存在这个Servlet、html、jsp页面时,web.xml中<welcome-file-list>标签元素就会指定显示的默认文件:index.jsp页面。
  2. 访问:http://localhost:8080/SpringMVC_test/fruits.action
    DispatcherServlet接收到请求后,访问映射器,根据映射器的类型:BeanNameUrlHandlerMapping(将Bean的name作为url进行查找,需要配置Handler时指定Beanname就是url),从springmvc.xml的配置文件中找到
    <bean name="/fruits.action" class="controller.FruitsController"></bean>,返回给DispatcherServlet
  3. DispatcherServlet访问适配器, 根据适配器类型:SimpleControllerHandlerAdapter(只要编写了实现了Controller接口的控制器,适配器就会执行Controller的具体方法),因为:
    public class FruitsController implements Controller 满足条件就执行它的handleRequest类返回ModelAndView(包含对应的显示页面和数据)给DispatcherServlet。
  4. DispatcherServlet访问视图解析器,根据类型:InternalResourceViewResolver(根据handler方法返回的modelandview中的视图的具体位置,加载相应的界面并绑定反馈数据),访问fruitsList.jsp页面,将数据动态加入到该页面中,然后返回给DispatcherServlet,再返回给浏览器。
    第四步中注意:
    a. 因为jsp中使用了jstl标签,所以要进行相关的配置。
    b. jsp放在WEB-INF(项目私有文件夹)中 这样用户就没法通过路径访问该网页,保证了视图的安全性。
    c. ModelAndView的视图地址:"/WEB-INF/jsp/fruitsList.jsp"不需要些webapp,那个省略。

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/82771858