美文网首页SpringCloud/微服务
Springmvc结构及项目配置

Springmvc结构及项目配置

作者: Zak1 | 来源:发表于2018-12-23 16:27 被阅读0次

    SpringMVC

    • SpringMVC结构图
    1545546821865.png
    1. 创建webproject

      1. 直接使用maven提供的web.app模板創建

        项目结构图:


        1545531860484.png
    1. 编写web.xml,在其中注册一个特殊的servlet,前端控制器

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app version="2.5"
               xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
          <display-name>Spring_Mvc</display-name>
          <servlet>
              <servlet-name>springmvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          </servlet>
          <!--urlpattern写/ 不要写/*-->
          <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
      </web-app>
      
      
    2. 编写一个SpringMvc的配置文件

      1. 注册一个视图解析器 (在web-inf下新建springmvc-servlet.xml文件,该文件供web.xml中的DispatcherServlet注册时查找)

        <?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"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
            <!--用以查找jsp文件:/jsp文件夹下的以.jsp结尾的文件-->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <!--前綴-->
                <property name="prefix" value="/jsp/"></property>
                <!--後綴-->
                <property name="suffix" value=".jsp"></property>
            </bean>
            <!--配置注解扫描文件-->
            <context:component-scan base-package="com.zakl.controller"></context:component-scan>
        
            <bean class="com.zakl.controller.HelloController" name="/helloController" ></bean>
        </beans>
        

    4.编写控制器(注意将返回视图放置与webapp下的jsp文件夹中,如果直接放在在根目录下,则setViewName("/mygirl.jsp"))

    //controller 只具有一个方法的接口成为函数式接口
    public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView mav=new ModelAndView();
            mav.addObject("girl","linda");
            mav.setViewName("mygirl");
            return mav;
        }
    },
    
    /* 基于注解模式-- 需要在springmvc-servlet.xml中注册扫描bean,该种实现比以上方法更简便  */
    
    @Controller //标记为spring的一个组件,并且是控制器的组件,此时handlermappong会去扫描这个controller是否与之匹配,匹配成功就将工作交予该controller,匹配原则通过@RequestMapping(URI)进行匹配  
    public class ByeController {
        @RequestMapping("/bbbb")
        public String method(Model model){
            model.addAttribute("model","李荣浩");
            return "bye";
        }
    }
    <context:component-scan base-package="com.zakl.controller"></context:component-scan>
    
    /*基于注解模式 --无需再springmvc.servlet.xml中注册component-sacn 但是需要注册controller Bean*/
    <bean class="com.zakl.controller.ByeController" ></bean>
    @Controller
    public class ByeController {
        @RequestMapping("/aa")
        public String bye(Model model){
            model.addAttribute("model","李荣浩");
            return "bye";//返回的string就是逻辑视图名称 bye.jsp
        }
        //访问路径aa
        //为什么可以成功,我都唔知。。。
    

    5.返回视图

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        this is my girl: ${girl}
    </body>
    </html>
    

    Springmvc-servlet.xml配置位置:

    ​ DispatcerSerlvet默认查找web-inf下的springmvc-servlet.xml文件[图片上传失败...(image-ebf666-1545553656872)]

    可以通过<init-param>标签更改位置满足maven项目式结构开发:

    <servlet>
            <!--[<servlet-name>]-servlet =namespace
            默认为在web-inf下查找namespace(springmvc-servlet).xml文件
            -->
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:mvc.xml</param-value>
            </init-param>
             <!-- 该种配置将命名空间更改为mvc = 在web-inf下查找mvc.xml文件
                <init-param>
                  <param-name>namespace</param-name>
                   <param-value>mvc</param-value>
                 </init-param>
            -->
        </servlet>
    

    jsp <c:foreach 遍历>

     <c:forEach items="${users}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.password}</td>
            </tr>
        </c:forEach>
    

    转发与重定向

    默认的 return 就是一种转发

    @RequestMapping("/aa")
        public String bye(Model model){
            model.addAttribute("model","李荣浩");
            return "bye";
        }
    

    重定向到页面(注意这里的的return要返回path ,注意以反斜杠表明地址,重定向无法传递当前数据,相当于用户重新发起一次request请求)

    @RequestMapping("/redirecttojsp")
        public String redirecttojsp(Model model){
            System.out.println("重定向");
            return "redirect:/index.jsp";
        }
    

    转发到控制器forward:控制器声明URI(其中的model数据仍然可以被新的控制器所接收,并最终返回给页面):

    @RequestMapping("/forward")
        public String forwardtoController(Model model){
            model.addAttribute("mmm","1111");
            System.out.println("forwardtoController");
            return "forward:/Bye/users";
        }
    

    springmvc访问web元素

    • request

      • @Controller
        @RequestMapping("/test")
        public class TestController {
            @RequestMapping("/request")
            public String getrequest(HttpServletRequest httpServletRequest){
                String o=httpServletRequest.getParameter("boy");
                System.out.println("输出内容"+o);
                return null;
            }
        }
        //控制台答应数据为:输出内容wuzerui
        //浏览器访问路径为:http://localhost:8080/SpringMvc_war_exploded/test/request?boy=wuzerui
        
    • session

      @RequestMapping("/session")
      public String setsession(HttpSession session){
          session.setAttribute("session","hi")
          session.getServletContext().setAttribute("会话","这是我的会话");
          return null;
      }
      //可通过另一个test.jsp页面中的${会话},${session},得到数据
      

    application

    SpringMVC注解详情

    • 路劲数组访问,多路径访问一个controller

      @RequestMapping(value=["/uri","/uri2"])

      @RequestMapping(path=["/uri","/uri2"])

    • 限定请求方式只能为GET(其他方式同理,可以写成数组):

      @RequestMapping(method=RequestMethod.GET)

      @RequestMapping(path ={"p1","p2"},method= RequestMethod.GET)
          public String onlyget(){
              System.out.println("this is onlygetMethod");
              return "test";
          }
      

    获取项目的地址:

    @WebServlet(urlPatterns = {},loadOnStartup = 2)
    public class WebPatInitServlet extends HttpServlet {
        @Override
        public void init(ServletConfig config) throws ServletException {
            //在整个应用中上下文使用webpath来存储上下文路径
            config.getServletContext().setAttribute("webpath",config.getServletContext().getContextPath());
            super.init(config);
        }
    }
    //loadonstartup =2 是为了让这个servlet最快加载,可以优先获取到webpath
    

    表单访问:

    <form action="${webpath}/test/p1" method="post" onsubmit="">
            <input type="submit">
    </form>
    <!--      以前的写法  ------->
     <form action="${pageContext.request.contextPath}/test/p1" method="post" onsubmit="">
            <input type="submit">
     </form>
    

    相关文章

      网友评论

        本文标题:Springmvc结构及项目配置

        本文链接:https://www.haomeiwen.com/subject/jwynkqtx.html