• springboot之web


    一、spring boot简介

         spring boot是最近非常流行的,在spring的框架上改进的框架。该框架的目的是为了提高开发人员的速度,降低配置的难度等等,极大了简化了开发流程。具体的详细的说明请参考官方文档。在日常工作中,由于需要搭建一套环境或者框架的机会非常的少,大部分都是在原有的基础上开发,所以当让你搭建一个简单的框架,就会出现各种各样的困难,比如说,我在搭建的一个服务器的时候,准备了一个小的demo,原以为非常的简单,结果遇到了各种各样的问题,而发现网上的博客都是零零散散的讲一些点,很难有一个完整的流程,包括可能会遇到的问题。这里对搭建一个简单的项目流程做一个详细的总结,方便日后参考,同时这一篇博客也是为了下一篇博客tengine反向代理服务器搭建做一点前置的基础准备。

    二、spring boot搭建web项目

           好了废话,不多说,下面正式开始单间一个web项目,使用的工具是eclipse来进行搭建,创建一个maven工程。下面开启贴图模式,这前面的过程都是非常的简单,网上也有大量的参考资料,这里为了保证一个完整性,开始贴图。

    首先就是很简单,右击-->new-->project 选择maven project

    然后选择一个默认的配置即可,一般包含的文件都会在里面。

    这里填写好group id其实就是包名,后面也可以更改的,还有artifiact id就是工程名称,然后单击完成,就创建一个简单的maven工程。

    具体的工程目录如下所示

    按照上面的流程建好了工程之后,可以查看到具体的工程目录如下,这里作为一个web项目还缺少如下相关目录用来存放web文件和配置文件。

    [html] view plain copy
     
    1. src/main/resources  //这个文件夹中存放的是配置文件例如application.properties 配置文件  
    2. src/main/webapp     //这个文件夹中存放的是前端的文件html,jsp、css  

    这些文件夹手动添加即可,添加完成之后,具体得到的如下图所示:

    要想把这个项目跑起来,需要做一下几个步骤:

      1. 首先需要配置一下pom.xml文件,引入spring-boot的相关依赖文件 ,这个是最基本的包,里面包含了运行的相关组件,例如tomcat,以及其他的jar包

    [html] view plain copy
     
    1. <parent>  
    2.     <groupId>org.springframework.boot</groupId>  
    3.     <artifactId>spring-boot-starter-parent</artifactId>  
    4.     <version>1.5.10.RELEASE</version>  
    5.    </parent>  
    [html] view plain copy
     
    1. <dependency>  
    2.        <groupId>org.springframework.boot</groupId>  
    3.        <artifactId>spring-boot-starter-web</artifactId>  
    4.    </dependency>  

    这样就能启动一个spring-boot的web项目,其中内嵌了相关的tomcat服务器,接下里是至关重要的,因为如果不引入下面的jar包,在调整jsp的页面的时候直接看到的是变成了下载的模式,笔者也是在这个地方郁闷了半天,百度上找了好多的例子,大部分都没讲到这个方面,故而在这里重点说明一下

    [html] view plain copy
     
    1. <!-- JSTL for JSP  spring boot搭建web项目,跳转到jsp一定要添加下面的jar包,否则出现跳转的时候,变成下载的功能,保存该页面-->  
    2.         <dependency>  
    3.             <groupId>javax.servlet</groupId>  
    4.             <artifactId>jstl</artifactId>  
    5.         </dependency>  
    6.   
    7.         <!-- Need this to compile JSP -->  
    8.         <dependency>  
    9.             <groupId>org.apache.tomcat.embed</groupId>  
    10.             <artifactId>tomcat-embed-jasper</artifactId>  
    11.             <scope>provided</scope>  
    12.         </dependency>  

    引入了这个jar之后呢,才能对jsp进行解析,编译,到这里之后,相关的依赖基本上都算引入完成。接下来要做的是配置application.properties配置文件,这里面也是有一堆坑在这里。默认的情况下,这个配置文件是不需要配置的,服务器也可以启动起来。但是很多同学在搭建玩项目之后,进行的跳转的时候,不是报找不到页面,就是解析错误。因为在这个配置文件中需要指定一下需要跳转的jsp页面的路径,即,具体在哪个文件夹下面,添加如下配置:

    [html] view plain copy
     
    1. #默认的位置是src/main/webapp 这里可以更换,比如/page/ 那么目录就变成了src/main/webapp/pages  
    2. spring.mvc.view.prefix=/  
    3. spring.mvc.view.suffix=.jsp  

    这里面还有一个坑,在新版本的spring boot中是按上面的配置,但是在老的版本中是如下的用法,名称不一样,这里需要注意一下,否则对于新学者来说,又要懵逼半天了...

    [html] view plain copy
     
    1. spring.view.prefix=/  
    2. spring.view.suffix=.jsp  

    然后需要创建jsp的页面了,在添加的源码包src/main/webapp的下面添加jsp文件,注意,webapp是默认的路径,如果想继续分类,则可以在该文件夹下面进行添加,比如说添加一个pages文件夹,jsp文件都放在这里面,那么spring.mvc.view.prefix=/pages/ 否则会找不到对应的文件。大体的目录结构如下所示:

    [html] view plain copy
     
    1. |----src/main/webapp  
    2.    |------index.jsp  
    3.    |------pages  
    4.       |----page.index  


    对于jsp页面中,就写入一点简单的测试语句就行了

    [html] view plain copy
     
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
    2.     pageEncoding="UTF-8"%>  
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    4. <html>  
    5. <head>  
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    7. <title>Insert title here</title>  
    8. </head>  
    9. <body>  
    10.     hello world!!!  
    11.     name=${name } welcome!  
    12.   
    13. </body>  
    14. </html>  

    好了,上面的步骤都完成之后,这里,只要编写简单的Controller即可,这里面提供了两个跳转路径一个是/home,一个是/home/page,一个是携带返回值,一个没有返回相应结果。

    [java] view plain copy
     
    1. @Controller  
    2. public class HomeController {  
    3.   
    4.     @RequestMapping(value="/home")  
    5.     public String home(){  
    6.         System.out.println("redirect to home page!");  
    7.         return "index";  
    8.     }  
    9.       
    10.       
    11.     @RequestMapping(value="/home/page")  
    12.     @ResponseBody  
    13.     public ModelAndView goHome(){  
    14.         System.out.println("go to the home page!");  
    15.         ModelAndView mode = new ModelAndView();  
    16.         mode.addObject("name", "zhangsan");  
    17.         mode.setViewName("index");  
    18.         return mode;  
    19.     }  
    20. }  

    然后在App类中,添加如下代码:

    [java] view plain copy
     
    1. @SpringBootApplication  
    2. public class App   
    3. {  
    4.     public static void main( String[] args )  
    5.     {  
    6.         SpringApplication.run(App.class);  
    7.     }  
    8. }  

    写好上面的Controller之后,在App类上面右击,选择Run Application执行main函数,看到控制台输出如下,说明spring boot启动成功

    [plain] view plain copy
     
    1.   .   ____          _            __ _ _  
    2.  /\ / ___'_ __ _ _(_)_ __  __ _      
    3. ( ( )\___ | '_ | '_| | '_ / _` |      
    4.  \/  ___)| |_)| | | | | || (_| |  ) ) ) )  
    5.   '  |____| .__|_| |_|_| |_\__, | / / / /  
    6.  =========|_|==============|___/=/_/_/_/  
    7.  :: Spring Boot ::       (v1.5.10.RELEASE)  
    8.   
    9. 2018-03-01 17:32:42.069  INFO 64878 --- [           main] com.spring.example.App                   : Starting App on fhldeMacBook-Air.local with PID 64878 (/Users/fhl/Documents/workspace1/spring-boot-example/target/classes started by fhl in /Users/fhl/Documents/workspace1/spring-boot-example)  
    10. 2018-03-01 17:32:42.074  INFO 64878 --- [           main] com.spring.example.App                   : No active profile set, falling back to default profiles: default  
    11. 2018-03-01 17:32:42.175  INFO 64878 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1d8299fd: startup date [Thu Mar 01 17:32:42 CST 2018]; root of context hierarchy  
    12. 2018-03-01 17:32:45.865  INFO 64878 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)  
    13. 2018-03-01 17:32:45.892  INFO 64878 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]  
    14. 2018-03-01 17:32:45.895  INFO 64878 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.27  
    15. 2018-03-01 17:32:46.530  INFO 64878 --- [ost-startStop-1] org.apache.jasper.servlet.TldScanner     : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.  
    16. 2018-03-01 17:32:46.542  INFO 64878 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext  
    17. 2018-03-01 17:32:46.543  INFO 64878 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 4371 ms  
    18. 2018-03-01 17:32:46.809  INFO 64878 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]  
    19. 2018-03-01 17:32:46.818  INFO 64878 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]  
    20. 2018-03-01 17:32:46.819  INFO 64878 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]  
    21. 2018-03-01 17:32:46.819  INFO 64878 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]  
    22. 2018-03-01 17:32:46.819  INFO 64878 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]  
    23. 2018-03-01 17:32:47.838  INFO 64878 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1d8299fd: startup date [Thu Mar 01 17:32:42 CST 2018]; root of context hierarchy  
    24. 2018-03-01 17:32:48.136  INFO 64878 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/home]}" onto public java.lang.String com.spring.example.controller.HomeController.home()  
    25. 2018-03-01 17:32:48.137  INFO 64878 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/home/page]}" onto public org.springframework.web.servlet.ModelAndView com.spring.example.controller.HomeController.goHome()  
    26. 2018-03-01 17:32:48.150  INFO 64878 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)  
    27. 2018-03-01 17:32:48.152  INFO 64878 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)  
    28. 2018-03-01 17:32:48.256  INFO 64878 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]  
    29. 2018-03-01 17:32:48.256  INFO 64878 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]  
    30. 2018-03-01 17:32:48.574  INFO 64878 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]  
    31. 2018-03-01 17:32:49.556  INFO 64878 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup  
    32. 2018-03-01 17:32:49.857  INFO 64878 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)  
    33. 2018-03-01 17:32:49.867  INFO 64878 --- [           main] com.spring.example.App                   : Started App in 8.378 seconds (JVM running for 8.905)  
    34. 2018-03-01 17:32:52.093  INFO 64878 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'  
    35. 2018-03-01 17:32:52.093  INFO 64878 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started  
    36. 2018-03-01 17:32:52.123  INFO 64878 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 29 ms  

    然后打开浏览器,输入地址http://127.0.0.1:8080/home/page

    看到返回结果如下所示,则表示跳转成功:

    三、Controller的几种返回值

            有点时候采用Controller返回跳转到前端页面的时候,经常会出现一些问题,有些同学搞不清楚具体的返回啥,这里做一个小结。

    1.ModelAndView 这个也是用的最多的类型,通过构造函数可以指定返回页面的名称,也可以通过方法setViewName()来设置需要跳转的页面,例如如下的例子,这里面不但返回index页面同时,携带参数name过来。通过addObject()可以把你需要返回的参数值设置进去,返回给前端。

    [java] view plain copy
     
    1. @RequestMapping(value="/home/page")  
    2.     @ResponseBody  
    3.     public ModelAndView goHome(){  
    4.         System.out.println("go to the home page!");  
    5.         ModelAndView mode = new ModelAndView();  
    6.         mode.addObject("name", "zhangsan");  
    7.         mode.setViewName("index");  
    8.         return mode;  
    9.     }  

    也可以直接通过构造函数返回,两者的效果是一样的

    [java] view plain copy
     
    1. @RequestMapping(value="/home/mv")  
    2.     @ResponseBody  
    3.     public ModelAndView goHomeByModeAndview(){  
    4.         System.out.println("go to the home page!");  
    5.         ModelAndView mode = new ModelAndView("index");  
    6.         mode.addObject("name", "zhangsan");  
    7.         return mode;  
    8.     }  

    2. String 类型,这个也是使用非常普遍的方法

    [java] view plain copy
     
    1. @RequestMapping(value="/home")  
    2. public String home(){  
    3.     System.out.println("redirect to home page!");  
    4.     return "index";  
    5. }  

    首先看这个方法,啥也没干,直接返回了字符串"index",返回的字符串表示一个视图名称,直接返回到index.jsp的页面。但是如果添加了如下的参数,此时返回的就不是视图名称了而是作为字符串,index,直接显示在页面上面。

    [java] view plain copy
     
    1. @RequestMapping(value="/home/res")  
    2.     @ResponseBody  
    3.     public String homeRes(){  
    4.         System.out.println("redirect to home page!");  
    5.         return "index";  
    6.     }  

    3. Model其实是一个接口,它的实现类是extendedModeMap类继承了ModelMap,具体可以参考modeMap

       主要作用用于传递控制方法的处理数据到前端 ,有点类似request的域的作用,比如setAttribute的方法来设置。

    4.Map对象,其实采用的就是key-value的形式,例如下面方法

    [java] view plain copy
     
    1. @RequestMapping(value="/home/map")  
    2.     public Map<String,String> testMap(){  
    3.           
    4.         Map<String, String> map = new HashMap<String, String>();  
    5.         map.put("name", "lisi");  
    6.         return map;  
    7.     }  

    这里响应的view等同于请求的view,等同于返回null,等同于void类型。

    5. void的类型,即没有返回值,响应的页面就是请求的页面 响应的地址/home/void就是这个

    [java] view plain copy
     
    1. @RequestMapping(value="/home/void")  
    2.     public void testVoid(){  
    3.         ModelAndView mode= new ModelAndView();  
    4.         mode.addObject("name","wagnwu");  
    5.     }  

    四、遇到的坑坑洼洼小结

        1. 如果有jsp文件的话,一定要进入相关的jar包依赖,否则,无法解析

        2. 如果只配置了spring boot的一个参数,@SpringBootApplication 此时,一定要把对应的Controller和其他组件放在这个包的路径以及子包的路径下面,否则注解无法被解析到或者手动配置扫描路径

      3. 在配置文件application.properties配置的选项没有生效的情况下,注意查看一下是否是新老版本的区别,导致配置的名称不同

    特别说明:转载:https://blog.csdn.net/fyhailin/article/details/79413864

    梦想这东西和经典一样,永远不会随时间而褪色,反而更加珍贵!
  • 相关阅读:
    Java正则表达式入门
    StringBuffer ,String,StringBuilder的区别
    JAVA的StringBuffer类
    容器vector的使用总结 容器stack(栈)
    c++网络通信(与服务器通信聊天)和c#网络通信
    C#与SQLite数据库
    我的vim配置文件
    在world中批量调整图片的大小
    C#判断文件及文件夹是否存在并创建(C#判断文件夹存在)
    C# Thread类的应用
  • 原文地址:https://www.cnblogs.com/haoxiu1004/p/9233812.html
Copyright © 2020-2023  润新知