【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架

基于请求驱动的轻量型Web框架------SpringMVC

  • 一级目录
    • 二级目录
      • 三级目录
  • 一SpringMVC入门
    • Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web 框架,即使用了MVC架构模式的思想,将web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
    • 1、springmvc能做什么
    • 2、Spring Web MVC处理请求的流程
    • 3、Spring Web MVC架构
  • 二、简单的springMVC架构,基于xml实现
    • 1、通过maven导入SpringMVC依赖
    • 2、web.xml文件中配置前端控制器
    • 3、在SpringMVC配置文件中配置HandlerMapping和HandlerAdapter、InternalResourceViewResolver
    • 4业务处理器
    • 5视图页面hang.jsp
    • 6 配置tomcat
    • 7测试
  • 三、简单的springMVC架构,基于注解实现
    • 1修改SpringMVC管理bean的配置文件
    • 2修改控制器
    • 3、注解详解
    • 4、窄化请求映射
  • 三、映射请求参数和请求方法
  • 四、数据绑定
    • 1处理方法支持的参数类型
    • 2@RequestParam通过url绑定单个请求参数值
    • 3@PathVariable 通过URI 绑定多个模板参数
    • 4@CookieValue 绑定Cookie数据值
    • 5@RequestHeader 绑定请求头数据
    • 6命令对象入参/表单入参
    • 7@ModelAttribute
    • 8@SessionAttributes 绑定命令对象到session(了解)
    • 9关于 cookie Session token 你知道多少?
  • 五、重定向与转发
  • 六、mvc:annotation-driven
    • 1注解简介
    • 2java各种类型对象转换json @ResponseBody 该注解导致无法跳转
    • 3使用fastjson转json(了解)
    • 4json转java对象@requestbody
  • 七 全局异常处理器的开发(公共模块)
    • 1自定义异常
    • 2自定义全局异常处理器
    • 3配置全局异常处理器
    • 4测试
  • 八自定义处理器拦截器
    • 注意:拦截器只针对tomcat项目根路径目录下的URL起着拦截作用!!!!!
    • 1、常见应用场景
    • 2、拦截器接口HandlerInterceptor
    • 3、拦截器适配器
    • 4、实现登录拦截
  • 九处理静态资源
  • 十 springMVC实现restful风格架构
    • 1什么是restful架构
    • 2资源的访问定位
  • 十一在restful风格中,关于拦截器拦截URI却不能拦截jsp/html资源名称请求的安全问题的解决
    • **1访问控制器映射的 uri(mvc/index),会被拦截器拦截,重定向到mvc/login:**
    • **2若是uri直接访问静态资源,springMVC的拦截器只会拦截controller上的映射请求,则不会拦截该请求,该访问会造成系统安全问题**
    • 3解决方案
  • `将所有的jsp文件放入到WEB-INF文件夹下,这样用户是直接不能访问WEB-INF文件下的jsp文件的。spring mvc的理念也是通过controller里的@RequestMapping来请求相关jsp页面,而非用户直接访问jsp页面。`

一级目录

二级目录

三级目录

一SpringMVC入门

Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web 框架,即使用了MVC架构模式的思想,将web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

1、springmvc能做什么

√让我们能非常简单的设计出干净的Web 层和薄薄的Web 层;
√进行更简洁的Web 层的开发;
√天生与Spring框架集成(如IoC容器、AOP等);
√提供强大的约定大于配置的契约式编程支持;
√能简单的进行Web 层的单元测试;
√支持灵活的URL到页面控制器的映射;
√非常容易与其他视图技术集成,如Velocity、FreeMarker 等等,因为模型数据不放在特定的API 里,而是放在一个
Model里(Map 数据结构实现,因此很容易被其他框架使用);
√非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
√提供一套强大的JSP标签库,简化JSP开发;
√支持灵活的本地化、主题等解析;
√更加简单的异常处理;
√对静态资源的支持;
√支持Restful风格。

2、Spring Web MVC处理请求的流程

在这里插入图片描述

1、首先用户发送请求—>前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的1、2 步骤;
2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);图中的3、4、5步骤;
3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤6、7;
4、前端控制器再次收回控制权,将响应返回给用户,图中的步骤8;至此整个结束。

3、Spring Web MVC架构

【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第1张图片

1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新
的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

二、简单的springMVC架构,基于xml实现

1、通过maven导入SpringMVC依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SpringMVC</artifactId>
    <version>1.0-SNAPSHOT</version>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--导入spring依赖-->
<dependencies>
    <!-- spring4.3.2 -->
    <!-- spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!-- spring-core -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!-- spring-beans -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!--使用AspectJ方式注解需要相应的包 -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.6.11</version>
    </dependency>
    <!--使用AspectJ方式注解需要相应的包 -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.11</version>
    </dependency>
    <!-- 添加数据库连接池 druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <!-- spring-tx 事务控制-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!-- spring-jdbc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!-- spring整合mybatis插件包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>compile</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <!-- 配置servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- 配置jsp -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.2.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- spring web -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <!-- spring webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
</dependencies>
如果需要maven运行web项目,需要添加maven的tomcat插件,如果不需要请直接在idea配置本地安装过的tomcat插件.
<build>
        <!-- 配置tomcat插件,web端 -->
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!-- 配置项目的请求路径 -->
                    <path>/mvc</path>
                    <!-- 配置服务器端口号 -->
                    <port>9091</port>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2、web.xml文件中配置前端控制器

(1)加载默认SpringMVC配置文件

"1.0" encoding="UTF-8"?>
-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!-- POST中文乱码过滤器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        -param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        -pattern>/*</url-pattern>
    </filter-mapping>
    <!--配置前端控制器-->
    
        -name>DispatcherServlet</servlet-name>
        -class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 服务器启动创建servlet对象 ,同时加载springmvc配置文件,默认是在WEB-INF下加载一个叫[servlet-name]-servlet.xml-->
        -on-startup>1</load-on-startup>
    </servlet>
    -mapping>
        -name>DispatcherServlet</servlet-name>
        -pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

(2)加载自定义SpringMVC配置文件

"1.0" encoding="UTF-8"?>
-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!-- POST中文乱码过滤器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        -param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
 
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        -pattern>/*</url-pattern>
    </filter-mapping>
    <!--配置前端控制器-->
    
        -name>DispatcherServlet</servlet-name>
        -class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 服务器启动创建servlet对象 ,同时加载springmvc配置文件,默认是在WEB-INF下加载一个叫[servlet-name]-servlet.xml-->
        -param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        -on-startup>1</load-on-startup>
    </servlet>
    -mapping>
        -name>DispatcherServlet</servlet-name>
        -pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

3、在SpringMVC配置文件中配置HandlerMapping和HandlerAdapter、InternalResourceViewResolver

"1.0" encoding="UTF-8"?>
"http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
   <!-- HandlerMapping -->
   class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
   <!-- HandlerAdapter -->
   class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
   <!-- ViewResolver -->
   class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      "prefix" value="/"/>
      "suffix" value=".jsp"/>
   </bean>
   <!--配置业务控制器-->
   "/shuang" class="com.alibaba.spring.web.controller.LoginController"></bean>
</beans>

4业务处理器

package baobaobaobao.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by @author LiuChunhang on 2020/4/8.
 */
public class EnUserController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("shuang","hang");
        modelAndView.setViewName("hang");
        return modelAndView;
    }
}

5视图页面hang.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    测试SpringMVC<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
Hello World
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
</code></pre> 
  <h2>6 配置tomcat</h2> 
  <p><a href="http://img.e-com-net.com/image/info8/91ef04bb56d047b9a7a5ffb4c8a34655.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/91ef04bb56d047b9a7a5ffb4c8a34655.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第2张图片" width="650" height="436" style="border:1px solid black;"></a><br> <img src="http://img.e-com-net.com/image/info8/fe7b8c5e50774fa3ad05f9e3d2258686.jpg" alt="在这里插入图片描述" width="0" height="0"></p> 
  <h2>7测试</h2> 
  <p><a href="http://img.e-com-net.com/image/info8/e3223fd7e6da4a17b72327aefdce6963.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e3223fd7e6da4a17b72327aefdce6963.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第3张图片" width="650" height="350" style="border:1px solid black;"></a><br> 解决tomcat中文乱码:<br> 在 tomcat / conf 目录下,设置 logging.properties ,增加参数 <code>java.util.logging.ConsoleHandler.encoding = GBK</code><br> <a href="http://img.e-com-net.com/image/info8/59208ccbc2a84b5fb4448942e4f7fc7a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/59208ccbc2a84b5fb4448942e4f7fc7a.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第4张图片" width="650" height="355" style="border:1px solid black;"></a><br> 然后重启:<br> <a href="http://img.e-com-net.com/image/info8/b8d2cc687fa94709a90294362501ef66.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b8d2cc687fa94709a90294362501ef66.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第5张图片" width="650" height="350" style="border:1px solid black;"></a><br> 测试成功<br> <a href="http://img.e-com-net.com/image/info8/b213786018a141f3b892e43ada5fa26f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b213786018a141f3b892e43ada5fa26f.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第6张图片" width="650" height="355" style="border:1px solid black;"></a></p> 
  <h1>三、简单的springMVC架构,基于注解实现</h1> 
  <h2>1修改SpringMVC管理bean的配置文件</h2> 
  <pre><code class="prism language-powershell"><?xml version=<span class="token string">"1.0"</span> encoding=<span class="token string">"UTF-8"</span>?>
<beans xmlns=<span class="token string">"http://www.springframework.org/schema/beans"</span>
       xmlns:xsi=<span class="token string">"http://www.w3.org/2001/XMLSchema-instance"</span>
       xmlns:context=<span class="token string">"http://www.springframework.org/schema/context"</span>
       xmlns:aop=<span class="token string">"http://www.springframework.org/schema/aop"</span> xmlns:tx=<span class="token string">"http://www.springframework.org/schema/tx"</span>
       xsi:schemaLocation=<span class="token string">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"</span>>
    <<span class="token operator">!</span>-<span class="token operator">-</span>启用注解扫描<span class="token operator">--</span>>
    <context:component<span class="token operator">-</span>scan base<span class="token operator">-</span>package=<span class="token string">"baobaobaobao.controller"</span>><<span class="token operator">/</span>context:component<span class="token operator">-</span>scan>




    <<span class="token operator">!</span>-<span class="token operator">-</span> HandlerMapping映射处理器 <span class="token operator">--</span>>
    <<span class="token operator">!</span>-<span class="token operator">-</span>Spring3<span class="token punctuation">.</span>1开始的注解HandlerMapping <span class="token operator">--</span>>
    <bean <span class="token keyword">class</span>=<span class="token string">"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"</span>><<span class="token operator">/</span>bean>

    <<span class="token operator">!</span>-<span class="token operator">-</span> HandlerAdapter处理适配器 <span class="token operator">--</span>>
    <<span class="token operator">!</span>-<span class="token operator">-</span>Spring3<span class="token punctuation">.</span>1开始的注解HandlerAdapter-<span class="token operator">-</span>>
    <bean <span class="token keyword">class</span>=<span class="token string">"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"</span>><<span class="token operator">/</span>bean>
    <<span class="token operator">!</span>-<span class="token operator">-</span> ViewResolver 视图解析器 <span class="token operator">--</span>>
    <bean <span class="token keyword">class</span>=<span class="token string">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>>
        <<span class="token operator">!</span>-<span class="token operator">-</span>前缀<span class="token punctuation">,</span>后缀指定跳转的位置<span class="token punctuation">,</span><span class="token operator">/</span>代表项目根路径<span class="token operator">--</span>>
        <property name=<span class="token string">"prefix"</span> value=<span class="token string">"/"</span><span class="token operator">/</span>>
        <property name=<span class="token string">"suffix"</span> value=<span class="token string">".jsp"</span><span class="token operator">/</span>>
    <<span class="token operator">/</span>bean>


<<span class="token operator">/</span>beans>
</code></pre> 
  <h2>2修改控制器</h2> 
  <pre><code class="prism language-powershell">不用再继承controller<span class="token punctuation">,</span>类和方法可以随便写<span class="token punctuation">,</span>原来的参数可以不要
</code></pre> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>controller<span class="token punctuation">;</span>

import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>stereotype<span class="token punctuation">.</span>Controller<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>bind<span class="token punctuation">.</span>annotation<span class="token punctuation">.</span>RequestMapping<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>ModelAndView<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>8<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
@Controller
public <span class="token keyword">class</span> EnUserController<span class="token punctuation">{</span>


    @RequestMapping<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">)</span>
    public ModelAndView handleRequest<span class="token punctuation">(</span><span class="token punctuation">)</span> throws Exception <span class="token punctuation">{</span>
        ModelAndView modelAndView = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>addObject<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">,</span><span class="token string">"hang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> modelAndView<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

</code></pre> 
  <h2>3、注解详解</h2> 
  <p>使用@controller的类会被组件扫描管理器context:component-scan自动扫描管理<br> Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求,@RequestMapping把请求与处理请求的方法映射在一起。</p> 
  <h2>4、窄化请求映射</h2> 
  <p><strong>(1)@RequestMapping可以修饰控制器类和方法上</strong><br> 类定义处:提供初步的请求映射信息,相对于WEB 应用的根目录下。<br> 方法处:提供进一步的细分映射信息,相对于类定义处的 URL。<br> 若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于WEB 应用的根目录DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法。<br> 修饰类:</p> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>controller<span class="token punctuation">;</span>

import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>stereotype<span class="token punctuation">.</span>Controller<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>bind<span class="token punctuation">.</span>annotation<span class="token punctuation">.</span>RequestMapping<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>ModelAndView<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>11<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
@Controller
@RequestMapping<span class="token punctuation">(</span><span class="token string">"manage"</span><span class="token punctuation">)</span>
public <span class="token keyword">class</span> ManageController <span class="token punctuation">{</span>
    @RequestMapping<span class="token punctuation">(</span><span class="token string">"dashuang"</span><span class="token punctuation">)</span>
    public ModelAndView handleRequest<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        ModelAndView modelAndView = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>addObject<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">,</span><span class="token string">"hang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> modelAndView<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/0e79d58effad4946b0f1e793ff14995a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0e79d58effad4946b0f1e793ff14995a.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第7张图片" width="650" height="355" style="border:1px solid black;"></a><br> <strong>(2)组合使用是“或”的关系</strong><br> @RequestMapping(value={"/many", “/many2”})多个请求映射到同一个处理方法上,可以用以下两种方法访问:</p> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>controller<span class="token punctuation">;</span>

import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>stereotype<span class="token punctuation">.</span>Controller<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>bind<span class="token punctuation">.</span>annotation<span class="token punctuation">.</span>RequestMapping<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>ModelAndView<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>11<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
@Controller
@RequestMapping<span class="token punctuation">(</span>value=<span class="token punctuation">{</span><span class="token string">"/many"</span><span class="token punctuation">,</span> <span class="token string">"/many2"</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
public <span class="token keyword">class</span> ManyController <span class="token punctuation">{</span>
    @RequestMapping<span class="token punctuation">(</span><span class="token string">"dashuang"</span><span class="token punctuation">)</span>
    public ModelAndView handleRequest<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        ModelAndView modelAndView = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>addObject<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">,</span><span class="token string">"hang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> modelAndView<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/6713373a21a64006aa500b75bf8a4861.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/6713373a21a64006aa500b75bf8a4861.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第8张图片" width="650" height="355" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/19cd037c416840a6922bae776942ab3e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/19cd037c416840a6922bae776942ab3e.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第9张图片" width="650" height="355" style="border:1px solid black;"></a></p> 
  <h1>三、映射请求参数和请求方法</h1> 
  <p><code>@RequestMapping</code> 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求。<code>@RequestMapping 的 value、method、params</code> 分别表示请求 <code>URL、请求方法、请求参数的映射条件</code>,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。<br> params 支持简单的表达式:</p> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value=<span class="token string">"/update"</span><span class="token punctuation">,</span>params=<span class="token string">"id=100"</span><span class="token punctuation">)</span>
</code></pre> 
  <p>id: 表示请求必须包含名为 id的请求参数<br> !param1: 表示请求不能包含名为 param1 的请求参数<br> param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1<br> {“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1<br> 请求方法映射限定:默认情况下,处理方法同时支持get和post请求:</p> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value=<span class="token string">"/create"</span><span class="token punctuation">,</span> method = RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">)</span>表示该请求只接受GET请求。
</code></pre> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value=<span class="token string">"/methodOr"</span><span class="token punctuation">,</span> method 
= <span class="token punctuation">{</span>RequestMethod<span class="token punctuation">.</span>POST<span class="token punctuation">,</span> RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">}</span><span class="token punctuation">)</span>表示该请求可以同时接受POST和GET请求。
</code></pre> 
  <p>请求数据中有指定参数名:</p> 
  <pre><code class="prism language-powershell">请求中必须包含一个参数名称为create的参数
@RequestMapping<span class="token punctuation">(</span>params=<span class="token string">"create"</span><span class="token punctuation">,</span> method=RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">)</span>
请求中必须包含一个参数名称,但是参数名称不是create。
@RequestMapping<span class="token punctuation">(</span>params=<span class="token string">"!create"</span><span class="token punctuation">,</span> method=RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">)</span>
请求中必须包含一个参数名称为submitFlag的参数,值必须是create
@RequestMapping<span class="token punctuation">(</span>params=<span class="token string">"submitFlag=create"</span><span class="token punctuation">,</span> method=RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">)</span>
请求中必须包含一个参数名称,参数名称是submitFlag,但是值不是create
@RequestMapping<span class="token punctuation">(</span>params=<span class="token string">"submitFlag!=create"</span><span class="token punctuation">,</span> method=RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">)</span>
请求中必须包含多个参数
@RequestMapping<span class="token punctuation">(</span>params=<span class="token punctuation">{</span><span class="token string">"test1"</span><span class="token punctuation">,</span> <span class="token string">"test2=create"</span><span class="token punctuation">,</span>”test3<span class="token operator">!</span>=delete”<span class="token punctuation">}</span><span class="token punctuation">)</span>
</code></pre> 
  <p>例子:<br> 创建一个dashuang.jsp视图页面,和一个shuang.jsp视图页面</p> 
  <p>dashuang.jsp</p> 
  <pre><code class="prism language-powershell"><<span class="token operator">%</span>@ page contentType=<span class="token string">"text/html;charset=UTF-8"</span> language=<span class="token string">"java"</span> <span class="token operator">%</span>>
<html>
<head>
    <title>测试SpringMVC<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>

<form action=<span class="token string">"/mvc/xiaoshuang"</span> method=<span class="token string">"post"</span> >
   <input <span class="token function">type</span>=<span class="token string">"submit"</span> value=<span class="token string">"提交"</span>>
<<span class="token operator">/</span>form>

<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>

</code></pre> 
  <p>shuang.jsp</p> 
  <pre><code class="prism language-powershell"><<span class="token operator">%</span>@ page contentType=<span class="token string">"text/html;charset=UTF-8"</span> language=<span class="token string">"java"</span> <span class="token operator">%</span>>
<html>
<head>
    <title>测试SpringMVC<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
$<span class="token punctuation">{</span>shuang<span class="token punctuation">}</span> <br>


<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>

</code></pre> 
  <p>控制器:<br> get方法返回dashuang<br> post方法返回xaioshuang</p> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>controller<span class="token punctuation">;</span>

import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>stereotype<span class="token punctuation">.</span>Controller<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>bind<span class="token punctuation">.</span>annotation<span class="token punctuation">.</span>RequestMapping<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>bind<span class="token punctuation">.</span>annotation<span class="token punctuation">.</span>RequestMethod<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>ModelAndView<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>8<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
@Controller
public <span class="token keyword">class</span> EnUserController<span class="token punctuation">{</span>
    @RequestMapping<span class="token punctuation">(</span>value = <span class="token string">"xiaoshuang"</span><span class="token punctuation">,</span>method = RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">)</span>
        public ModelAndView handleRequesttwo<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        ModelAndView modelAndView = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>addObject<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">,</span><span class="token string">"dahang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> modelAndView<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    @RequestMapping<span class="token punctuation">(</span>value = <span class="token string">"xiaoshuang"</span><span class="token punctuation">,</span>method = <span class="token punctuation">{</span>RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">,</span>RequestMethod<span class="token punctuation">.</span>POST<span class="token punctuation">}</span><span class="token punctuation">)</span>
    public ModelAndView handleRequest<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        ModelAndView modelAndView = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>addObject<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">,</span><span class="token string">"xiaohang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"shuang"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> modelAndView<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

</code></pre> 
  <p>测试:<br> dashuang.jsp<br> <a href="http://img.e-com-net.com/image/info8/28ac6a4997484699b6bb69a051eccb07.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/28ac6a4997484699b6bb69a051eccb07.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第10张图片" width="650" height="355" style="border:1px solid black;"></a><br> 点击提交:<br> 返回xiaoshuang?name=xiaoshuang<br> 返回值xiaoshuang<br> <a href="http://img.e-com-net.com/image/info8/10c1f519993c4609b235bdd7e74b2987.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/10c1f519993c4609b235bdd7e74b2987.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第11张图片" width="650" height="355" style="border:1px solid black;"></a></p> 
  <h1>四、数据绑定</h1> 
  <pre><code class="prism language-powershell">JaveWeb数据参数四种主要的范围:

1<span class="token punctuation">.</span>page: page表示页面范围。 页面范围对应的时间段为:从客户访问一个jsp文件开始,到这个jsp文件执行结束。

2<span class="token punctuation">.</span>request:  request表示请求范围。 请求范围时间段为:从客户请求访问一个jsp文件开始,到这个jsp返回响应结果结束,如果这个jsp文件把请求转发给其他web组件,那么知道其他web组件返回响应结果结束。    请求范围是指服务器响应一次客户请求的过程,从servlet容器接收到一个客户请求开始,到返回响应结果结束, 请求范围与servletRequest和servletResponse相对应。

3<span class="token punctuation">.</span>session: session表示会话范围。 会话范围对应着整个会话的生存周期。会话范围是指浏览器与一个web应用进行一次会话的过程。具体实现上,会话范围与httpsession对象的生命周期相对应。因此web组件只要共享同一个httpsession对象也就能共享会话范围内的数据。  举例说明: 浏览器进程第一次请求访问应用中一个支持会话的网页,servlet容器驶入寻找请求中表示sessionID的cookie,由于还不存在这样的cookie,所以一个新的会话开始了,创建一个httpsession的对象,然后为它分配唯一的sessionID,并把id作为Cookie放在http响应结果中,当浏览器接收到http响应后,会把sessionID保存的cookie保存在客户端。浏览器进程继续访问应用的任意一个支持会哈德页面,http请求会包含表示sessionID的Cookie,servlet容器试图寻找http请求中sessionID的cookie,找到后可以找到与sessionID匹配的httpSession。

4<span class="token punctuation">.</span>application(应用)范围: web应用范围对应整个web应用的生存周期。web应用范围值得是web应用的生命周期,具体实现上web应用范围与servletContext对象的生命周期对应,web应用范围内的共享数据作为servletContext的属性存在。因此web组件只要共享同一个servletContext对象就能共享web应用范围内的共享数据。
</code></pre> 
  <h2>1处理方法支持的参数类型</h2> 
  <p>1.<code>ServletRequest/HttpServletRequest</code> 和<code>ServletResponse/HttpServletResponse</code><br> 参考xml实现mvc</p> 
  <p>2.<code>InputStream/OutputStream</code> 和<code>Reader/Writer</code><br> 部分代码:</p> 
  <pre><code class="prism language-powershell">public void execute<span class="token punctuation">(</span>InputStream requestBodyIn<span class="token punctuation">,</span> 
OutputStream responseBodyOut<span class="token punctuation">)</span>throws IOException <span class="token punctuation">{</span>
responseBodyOut<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">"success"</span><span class="token punctuation">.</span>getBytes<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p>requestBodyIn:获取请求的内容区字节流,等价于request.getInputStream();<br> responseBodyOut:获取相应的内容区字节流,等价于response.getOutputStream()。<br> reader:获取请求的内容区字符流,等价于request.getReader();<br> writer:获取相应的内容区字符流,等价于response.getWriter()。</p> 
  <p>3.<code>WebRequest/NativeWebRequest</code><br> WebRequest是Spring Web MVC提供的统一请求访问接口,不仅仅可以访问请求相关数据(如参数区数据、请求头数据,但访问不到Cookie区数据),还可以访问会话和上下文中的数据;NativeWebRequest继承了WebRequest,并提供访问本地Servlet API的方法。<br> 部分代码:</p> 
  <pre><code class="prism language-powershell">public String webRequest<span class="token punctuation">(</span>WebRequest webRequest<span class="token punctuation">,</span> NativeWebRequest nativeWebRequest<span class="token punctuation">)</span> <span class="token punctuation">{</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span>webRequest<span class="token punctuation">.</span>getParameter<span class="token punctuation">(</span><span class="token string">"test"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">/</span><span class="token operator">/</span>①得到请求参数test的值
webRequest<span class="token punctuation">.</span>setAttribute<span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"value"</span><span class="token punctuation">,</span> WebRequest<span class="token punctuation">.</span>SCOPE_REQUEST<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">/</span><span class="token operator">/</span>②
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span>webRequest<span class="token punctuation">.</span>getAttribute<span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> WebRequest<span class="token punctuation">.</span>SCOPE_REQUEST<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
HttpServletRequest request =
nativeWebRequest<span class="token punctuation">.</span>getNativeRequest<span class="token punctuation">(</span>HttpServletRequest<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">/</span><span class="token operator">/</span>③
HttpServletResponse response =
nativeWebRequest<span class="token punctuation">.</span>getNativeResponse<span class="token punctuation">(</span>HttpServletResponse<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span>
</code></pre> 
  <p>;<br> ① webRequest.getParameter:访问请求参数区的数据,可以通过getHeader()访问请求头数据;<br> ② webRequest.setAttribute/getAttribute:到指定的作用范围内取/放属性数据,Servlet定义的三个作用范围<br> 分别使用如下常量代表:<br> SCOPE_REQUEST :代表请求作用范围;<br> SCOPE_SESSION :代表会话作用范围;<br> SCOPE_GLOBAL_SESSION :代表全局会话作用范围,即ServletContext上下文作用范围。<br> ③ nativeWebRequest.getNativeRequest/nativeWebRequest.getNativeResponse:得到本地的ServletAPI。</p> 
  <p>4<code>.重要HttpSession(此处的session永远不为null)</code><br> 注意:session 访问不是线程安全的,如果需要线程安全,需要设置AnnotationMethodHandlerAdapter 或<br> RequestMappingHandlerAdapter 的synchronizeOnSession属性为true,即可线程安全的访问session。</p> 
  <p>5 <code>表单实体对象</code></p> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>ennity<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>12<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
public <span class="token keyword">class</span> EnUser <span class="token punctuation">{</span>
    private String name<span class="token punctuation">;</span>
    private int age<span class="token punctuation">;</span>

    public EnUser<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        super<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    public EnUser<span class="token punctuation">(</span>String name<span class="token punctuation">,</span> int age<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        this<span class="token punctuation">.</span>name = name<span class="token punctuation">;</span>
        this<span class="token punctuation">.</span>age = age<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    @Override
    public String toString<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token string">"EnUser{"</span> <span class="token operator">+</span>
                <span class="token string">"name='"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">'\'' +
                ", age=" + age +
                '</span><span class="token punctuation">}</span>'<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    public String getName<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> name<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    public void setName<span class="token punctuation">(</span>String name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        this<span class="token punctuation">.</span>name = name<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <pre><code class="prism language-powershell">  @RequestMapping<span class="token punctuation">(</span>value = <span class="token string">"hang"</span><span class="token punctuation">,</span>method = <span class="token punctuation">{</span>RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">,</span>RequestMethod<span class="token punctuation">.</span>POST<span class="token punctuation">}</span><span class="token punctuation">)</span>
    public String test<span class="token punctuation">(</span>EnUser enUser<span class="token punctuation">)</span><span class="token punctuation">{</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"啦啦啦啦啦啦啦啦啦啦啦啦"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span>enUser<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token string">"temp"</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token operator">/</span><span class="token operator">/</span>controller方法的返回值除了modelandview也可以为string<span class="token punctuation">,</span>意义为视图的名字
</code></pre> 
  <p>temp.jsp<br> <a href="http://img.e-com-net.com/image/info8/bd2b9b9e6f3f4311825f85302d5ca7c6.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/bd2b9b9e6f3f4311825f85302d5ca7c6.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第12张图片" width="650" height="551" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/5e2a8cbdc35844fc8372efcb94e12dce.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/5e2a8cbdc35844fc8372efcb94e12dce.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第13张图片" width="650" height="394" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/8d65fcca498044f5906ba0759eb9b71f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/8d65fcca498044f5906ba0759eb9b71f.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第14张图片" width="650" height="157" style="border:1px solid black;"></a><br> 6.<code>模型Model、Map、ModelMap</code><br> Spring Web MVC 提供Model、Map或ModelMap让我们能去暴露渲染视图需要的模型数据。<br> 虽然此处注入的是三个不同的类型(Model model, Map model2, ModelMap model3),但三者是同一个对象,页面取值都在request中。</p> 
  <p><a href="http://img.e-com-net.com/image/info8/98255d105385402188e6c072bb395c34.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/98255d105385402188e6c072bb395c34.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第15张图片" width="182" height="231" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/d5895b51a5b04e8182a675925222c5f4.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d5895b51a5b04e8182a675925222c5f4.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第16张图片" width="634" height="221" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/99914901057d41beb284c7c87859f217.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/99914901057d41beb284c7c87859f217.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第17张图片" width="650" height="376" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/3be9bdff2a304d71b2f938c5d311486b.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3be9bdff2a304d71b2f938c5d311486b.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第18张图片" width="502" height="283" style="border:1px solid black;"></a><br> <img src="http://img.e-com-net.com/image/info8/7435de6aded24c67a131e56a48edd30f.jpg" alt="在这里插入图片描述" width="0" height="0"></p> 
  <h2>2@RequestParam通过url绑定单个请求参数值</h2> 
  <p>@RequestParam用于将请求参数区数据映射到功能处理方法的参数上。</p> 
  <p>不指定入参名称</p> 
  <pre><code class="prism language-powershell">public String requestparam<span class="token punctuation">(</span>@RequestParam String username<span class="token punctuation">)</span>
</code></pre> 
  <p>如果请求中包含参数(如/requestparam?username=zhang),则自动传入。<br> 如果请求中不包含参数(如/requestparam?username=zhang),则报错。</p> 
  <p>指定入参名称:</p> 
  <pre><code class="prism language-powershell">public String requestparam2<span class="token punctuation">(</span>@RequestParam<span class="token punctuation">(</span><span class="token string">"username"</span><span class="token punctuation">)</span> String username<span class="token punctuation">)</span><span class="token string">''</span>
</code></pre> 
  <p>如果请求中包含username 参数(如/requestparam?username=zhang),则自动传入。<br> 如果请求中不包含username 参数(如/requestparam?username=zhang),则报错。</p> 
  <p>@RequestParam注解主要有哪些参数:<br> <code>value</code>:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;<br> <code>required</code>:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报400错误码;<br> <code>defaultValue</code>:默认值,表示如果请求中没有同名参数时的默认值</p> 
  <pre><code class="prism language-powershell">public String requestparam5<span class="token punctuation">(</span>@RequestParam<span class="token punctuation">(</span>value=<span class="token string">"username"</span><span class="token punctuation">,</span> required=true<span class="token punctuation">,</span> defaultValue=<span class="token string">"zhang"</span><span class="token punctuation">)</span> String username<span class="token punctuation">)</span>
</code></pre> 
  <p>例子1(传参)如下:<br> <a href="http://img.e-com-net.com/image/info8/9ade96961035429bbed23b2a92f0358e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/9ade96961035429bbed23b2a92f0358e.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第19张图片" width="650" height="177" style="border:1px solid black;"></a><br> <img src="http://img.e-com-net.com/image/info8/595f18b385a1485296fa0464d386f133.jpg" alt="在这里插入图片描述" width="650" height="22"><br> <img src="http://img.e-com-net.com/image/info8/ef5542fc6b214100bcaeca0bb9204a25.jpg" alt="在这里插入图片描述" width="0" height="0"><br> 例子2(不传参resuqire=false)如下:<br> <a href="http://img.e-com-net.com/image/info8/eb397123213f47ac87fab74a391f29e0.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/eb397123213f47ac87fab74a391f29e0.jpg" alt="在这里插入图片描述" width="650" height="56"></a><br> <a href="http://img.e-com-net.com/image/info8/55ce9c3c37d242a88095b5667d7b8ff1.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/55ce9c3c37d242a88095b5667d7b8ff1.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第20张图片" width="650" height="116" style="border:1px solid black;"></a><br> 例子3(默认参数)如下:<br> <a href="http://img.e-com-net.com/image/info8/c07d6aa0eab34bcbafb1b227373d75e8.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c07d6aa0eab34bcbafb1b227373d75e8.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第21张图片" width="650" height="146" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/2aa24c8bbc0e4310b103834bebda490b.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2aa24c8bbc0e4310b103834bebda490b.jpg" alt="在这里插入图片描述" width="650" height="46"></a><br> <a href="http://img.e-com-net.com/image/info8/d22d12eceb674508b4c2b046ce19eefd.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d22d12eceb674508b4c2b046ce19eefd.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第22张图片" width="650" height="101" style="border:1px solid black;"></a></p> 
  <h2>3@PathVariable 通过URI 绑定多个模板参数</h2> 
  <p>@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。<br> @RequestMapping(value="/users/{userId}/topics/{topicId}")<br> public String test(<br> @PathVariable(value=“userId”) int userId,<br> @PathVariable(value=“topicId”) int topicId){<br> …<br> }<br> 如请求的 URL 为“控制器URL/users/123/topics/456”,则自动将URL 中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。</p> 
  <p>例子如下:<br> <a href="http://img.e-com-net.com/image/info8/7d038a0ebad94a6dba0d250a4eb851da.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/7d038a0ebad94a6dba0d250a4eb851da.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第23张图片" width="607" height="219" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/ed0b7a78e9c7411cad831df1a2a581b7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/ed0b7a78e9c7411cad831df1a2a581b7.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第24张图片" width="650" height="353" style="border:1px solid black;"></a></p> 
  <p><a href="http://img.e-com-net.com/image/info8/3abbf9673d7544f4a407b6bf36fd0b5c.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3abbf9673d7544f4a407b6bf36fd0b5c.jpg" alt="在这里插入图片描述" width="650" height="64"></a></p> 
  <h2>4@CookieValue 绑定Cookie数据值</h2> 
  <p>Cookie有唯一值,储存session id<br> <a href="http://img.e-com-net.com/image/info8/21e265928b6b4945b56e807f5f7ef984.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/21e265928b6b4945b56e807f5f7ef984.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第25张图片" width="650" height="183" style="border:1px solid black;"></a><br> 官方解释cookie<br> <a href="http://img.e-com-net.com/image/info8/0cac0d168f2a4ecdadbb926583adf6b7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0cac0d168f2a4ecdadbb926583adf6b7.jpg" alt="在这里插入图片描述" width="650" height="37"></a><br> @CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。<br> public String test(@CookieValue(value=“JSESSIONID”, defaultValue="") String sessionId){<br> …<br> }<br> 如上配置将自动将JSESSIONID 值入参到sessionId参数上,defaultValue 表示Cookie 中没有JSESSIONID 时默认为空。<br> 传入参数类型也可以是javax.servlet.http.Cookie类型:<br> public String test2(@CookieValue(value=“JSESSIONID”, defaultValue="") Cookie sessionId){<br> …<br> }<br> 浏览器获取cookie:<br> <a href="http://img.e-com-net.com/image/info8/1a3619a56746403ca8d1caaedafa7cd8.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/1a3619a56746403ca8d1caaedafa7cd8.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第26张图片" width="650" height="146" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/e9fbaca3e79d445689886ad8da96324a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e9fbaca3e79d445689886ad8da96324a.jpg" alt="在这里插入图片描述" width="650" height="60"></a><br> <a href="http://img.e-com-net.com/image/info8/e91dd2196e254f90838ba13fa4067315.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e91dd2196e254f90838ba13fa4067315.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第27张图片" width="650" height="347" style="border:1px solid black;"></a><br> 向服务器发送cookie:<br> <img src="http://img.e-com-net.com/image/info8/94c9ea6524be49bba862c15580ae738e.jpg" alt="在这里插入图片描述" width="0" height="0"><br> <a href="http://img.e-com-net.com/image/info8/ab66c93c9e334d09940ff55d22043d48.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/ab66c93c9e334d09940ff55d22043d48.jpg" alt="在这里插入图片描述" width="614" height="73"></a></p> 
  <h2>5@RequestHeader 绑定请求头数据</h2> 
  <p>@RequestHeader 用于将请求的头信息区数据映射到功能处理方法的参数上。</p> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value=<span class="token string">"/header"</span><span class="token punctuation">)</span>
public String test<span class="token punctuation">(</span>@RequestHeader<span class="token punctuation">(</span><span class="token string">"User-Agent"</span><span class="token punctuation">)</span> 
String userAgent<span class="token punctuation">,</span>@RequestHeader<span class="token punctuation">(</span>value=<span class="token string">"Accept"</span><span class="token punctuation">)</span> String<span class="token punctuation">[</span><span class="token punctuation">]</span> accepts<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p>如上配置将自动将请求头“User-Agent”值入参到userAgent 参数上,并将“Accept”请求头值入参到accepts参数上。<br> @RequestHeader 也拥有和@RequestParam相同的三个参数,含义一样。</p> 
  <p>例子如下:<br> <img src="http://img.e-com-net.com/image/info8/f1a4fddef2464adfa7a13071d9843311.jpg" alt="在这里插入图片描述" width="0" height="0"></p> 
  <p><a href="http://img.e-com-net.com/image/info8/aed3552730284935a5c3dfefc2b3e081.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/aed3552730284935a5c3dfefc2b3e081.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第28张图片" width="636" height="129" style="border:1px solid black;"></a></p> 
  <p><a href="http://img.e-com-net.com/image/info8/d4ff2d53604d474ba577e59e69274635.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d4ff2d53604d474ba577e59e69274635.jpg" alt="在这里插入图片描述" width="597" height="87"></a><br> <a href="http://img.e-com-net.com/image/info8/81fe19a83c5443239d9787b09035ce33.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/81fe19a83c5443239d9787b09035ce33.jpg" alt="在这里插入图片描述" width="563" height="70"></a><br> <a href="http://img.e-com-net.com/image/info8/3346cc6270c348168ee0e7fbd97d8ec7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3346cc6270c348168ee0e7fbd97d8ec7.jpg" alt="在这里插入图片描述" width="509" height="89"></a></p> 
  <p><a href="http://img.e-com-net.com/image/info8/ff5b57b9bd1e4f92a10c6000ac5a7281.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/ff5b57b9bd1e4f92a10c6000ac5a7281.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第29张图片" width="650" height="124" style="border:1px solid black;"></a></p> 
  <h2>6命令对象入参/表单入参</h2> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value = <span class="token punctuation">{</span> <span class="token string">"/dept"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token operator">/</span><span class="token operator">/</span>参数为对象类型,可直接接收请求中的参数
	public ModelAndView dept<span class="token punctuation">(</span>DeptEntity dept<span class="token punctuation">)</span> <span class="token punctuation">{</span>
		System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"dept:"</span> <span class="token operator">+</span> dept<span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token operator">/</span><span class="token operator">/</span> 模型试图对象
		ModelAndView mav = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		mav<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"update"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token keyword">return</span> mav<span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
</code></pre> 
  <h2>7@ModelAttribute</h2> 
  <p>1.绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;</p> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value = <span class="token punctuation">{</span> <span class="token string">"/ma"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
public ModelAndView ma<span class="token punctuation">(</span>@ModelAttribute<span class="token punctuation">(</span><span class="token string">"dept"</span><span class="token punctuation">)</span> DeptEntity dept<span class="token punctuation">,</span>Map map<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">}</span>
@ModelAttribute<span class="token punctuation">(</span><span class="token string">"dept"</span><span class="token punctuation">)</span> DeptEntity dept等价于
model<span class="token punctuation">.</span>addObject(“dept”,obj);
</code></pre> 
  <p>@ModelAttribute它的作用是将该绑定的命令对象以“dept”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${dept.dname}来获取绑定的命令对象的属性。</p> 
  <p>例子如下:<br> 下图 UserModel为实体类.<br> <a href="http://img.e-com-net.com/image/info8/fc022fa66aa24ec5924b0f57c183881e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/fc022fa66aa24ec5924b0f57c183881e.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第30张图片" width="588" height="141" style="border:1px solid black;"></a></p> 
  <p><img src="http://img.e-com-net.com/image/info8/5f00c4b12d41453398dcd70b13bc9905.jpg" alt="在这里插入图片描述" width="0" height="0"><br> <a href="http://img.e-com-net.com/image/info8/a11b0943c9734b60835234c2ff1f2798.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a11b0943c9734b60835234c2ff1f2798.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第31张图片" width="650" height="318" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/35e8d7ee0d874ebd8d52157a5e54d6e2.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/35e8d7ee0d874ebd8d52157a5e54d6e2.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第32张图片" width="484" height="321" style="border:1px solid black;"></a></p> 
  <p>2.暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,该方法在执行功能处理方法(@RequestMapping 注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用或在处理方法中使用;</p> 
  <pre><code class="prism language-powershell">	@ModelAttribute<span class="token punctuation">(</span><span class="token string">"dept"</span><span class="token punctuation">)</span>
	public DeptEntity getDept<span class="token punctuation">(</span>String dno<span class="token punctuation">)</span> <span class="token punctuation">{</span>
		DeptEntity dept=new DeptEntity<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		dept<span class="token punctuation">.</span>setDno<span class="token punctuation">(</span>Integer<span class="token punctuation">.</span>parseInt<span class="token punctuation">(</span>dno<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token keyword">return</span> dept<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p>如上代码会在执行功能处理方法之前执行,并将其自动添加到模型对象中。<br> 1、先于处理方法执行<br> 2、把方法的返回值放入model中<br> 3、可以通过参数接收表单对象</p> 
  <p>例子如下:<br> <a href="http://img.e-com-net.com/image/info8/da69ecc8b6e043bb90127327f973b75a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/da69ecc8b6e043bb90127327f973b75a.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第33张图片" width="610" height="288" style="border:1px solid black;"></a><br> <img src="http://img.e-com-net.com/image/info8/1f7d3f45822948acbffcef51d808c9af.jpg" alt="在这里插入图片描述" width="0" height="0"><br> <a href="http://img.e-com-net.com/image/info8/efc5c58f6617432b85a3ed23b4c64ec3.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/efc5c58f6617432b85a3ed23b4c64ec3.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第34张图片" width="642" height="305" style="border:1px solid black;"></a></p> 
  <p><a href="http://img.e-com-net.com/image/info8/791bacde51414927adcaa9286df084f7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/791bacde51414927adcaa9286df084f7.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第35张图片" width="535" height="146" style="border:1px solid black;"></a><br> 3.暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。</p> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value = <span class="token punctuation">{</span> <span class="token string">"/returnDept"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
Public @ModelAttribute<span class="token punctuation">(</span><span class="token string">"dept"</span><span class="token punctuation">)</span>  DeptEntity returnDept<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
		DeptEntity dept = new DeptEntity<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		dept<span class="token punctuation">.</span>setDno<span class="token punctuation">(</span>304<span class="token punctuation">)</span><span class="token punctuation">;</span>
		dept<span class="token punctuation">.</span>setDname<span class="token punctuation">(</span><span class="token string">"大数据部"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		dept<span class="token punctuation">.</span>setDloc<span class="token punctuation">(</span><span class="token string">"长江"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token keyword">return</span> dept<span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
此时没有设置viewname,该
</code></pre> 
  <p>如何跳转?<br> RequestToViewNameTranslator类:用于直接将请求转换为逻辑视图名。<br> 默认实现为DefaultRequestToViewNameTranslator。<br> DefaultRequestToViewNameTranslator:将请求URL转换为逻辑视图名,默认规则如下:</p> 
  <p>http://localhost:9080/web 上下文/list -------> 逻辑视图名为list<br> http://localhost:9080/web 上下文/list.html -------> 逻辑视图名为list(默认删除扩展名)<br> http://localhost:9080/web 上下文/user/list.html -------> 逻辑视图名为user/list</p> 
  <p>1.把处理方法中的命令对象,放到model中。<br> 2.把非处理方法的返回值,放到model中,必须注意该方法先于处理方法执行,同时其参数可以封装表单参数。<br> 3.把处理方法的返回值,放入model中。</p> 
  <p>例子如下:<br> <a href="http://img.e-com-net.com/image/info8/73d40e7053b942598e114fc41c902aef.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/73d40e7053b942598e114fc41c902aef.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第36张图片" width="650" height="199" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/34cf9fb30e974b808d4742e385f7a236.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/34cf9fb30e974b808d4742e385f7a236.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第37张图片" width="650" height="243" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/4636536419b04393bfd2b20156f43f16.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4636536419b04393bfd2b20156f43f16.jpg" alt="在这里插入图片描述" width="650" height="59"></a><br> <img src="http://img.e-com-net.com/image/info8/5550658b00284adeb9319a018c967e85.jpg" alt="在这里插入图片描述" width="0" height="0"></p> 
  <h2>8@SessionAttributes 绑定命令对象到session(了解)</h2> 
  <p>有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。<br> //1、在控制器类头上添加@SessionAttributes注解<br> @SessionAttributes(value = {“user”})<br> public class SessionAttributeController</p> 
  <p>//2、@ModelAttribute注解的方法进行表单引用对象的创建<br> @ModelAttribute(“user”) //<br> public UserModel initUser()</p> 
  <p>//3、@RequestMapping注解方法的@ModelAttribute注解的参数进行命令对象的绑定<br> @RequestMapping("/session1") //<br> public String session1(@ModelAttribute(“user”) UserModel user)</p> 
  <p>//4、通过SessionStatus的setComplete()方法清除@SessionAttributes指定的会话数据<br> @RequestMapping("/session2") //<br> public String session(@ModelAttribute(“user”) UserModel user, SessionStatus status) {<br> if(true) { //④<br> status.setComplete();<br> }<br> return “success”;<br> }</p> 
  <p><code>@SessionAttributes(value = {"user"})</code>含义:</p> 
  <p>@SessionAttributes(value = {“user”}) 标识将模型数据中的名字为“user” 的对象存储到会话中(默认HttpSession),此处value指定将模型数据中的哪些数据(名字进行匹配)存储到会话中,此外还有一个types属性表示模型数据中的哪些类型的对象存储到会话范围内,如果同时指定value和types属性则那些名字和类型都匹配的对象才能存储到会话范围内。<br> 由@SessionAttributes引发的异常:<br> 如果在处理类定义处标注了@SessionAttributes(“xxx”),则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出 HttpSessionRequiredException 异常。</p> 
  <p>@Controller<br> @RequestMapping("/user")<br> @SessionAttributes(“user”)<br> public class UserController {<br> @ModelAttribute(“user”)<br> public User getUser(){<br> User user = new User();<br> return user;<br> }<br> @RequestMapping(value = “/user”)<br> public String handle71(@ModelAttribute(“user”) User user){<br> …<br> }<br> @RequestMapping(value = “/handle72”)<br> public String handle72(ModelMap modelMap,SessionStatus sessionStatus){<br> …<br> }<br> }</p> 
  <h2>9关于 cookie Session token 你知道多少?</h2> 
  <p><strong>1.什么是cookie?</strong></p> 
  <pre><code class="prism language-powershell">Cookie 技术产生源于 HTTP 协议在互联网上的急速发展。随着互联网时代的策马奔腾,带宽等限制不存在了,人们需要更复杂的互联网交互活动,就必须同服务器保持活动状态(简称:保活)。

Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息<span class="token punctuation">.</span>
</code></pre> 
  <p><strong>2…Cookie时效性</strong></p> 
  <pre><code class="prism language-powershell">Cookie的默认时效为Session,也就是说浏览器关闭,Cookie会和session一起失效,但是Cookie的有效时间是可以设置的。

Cookie有一个属性expires,设置其值为一个时间,那么当到达此时间后,此cookie失效。
</code></pre> 
  <p>非持久化<br> <a href="http://img.e-com-net.com/image/info8/9f36c84c6f5a4f80b23f3a63c9b56dff.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/9f36c84c6f5a4f80b23f3a63c9b56dff.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第38张图片" width="650" height="174" style="border:1px solid black;"></a><br> 持久化<br> <a href="http://img.e-com-net.com/image/info8/1128ceca9000463c87bce5dd2ff45215.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/1128ceca9000463c87bce5dd2ff45215.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第39张图片" width="650" height="276" style="border:1px solid black;"></a><br> <strong>3Okhttp框架</strong></p> 
  <pre><code class="prism language-powershell">Okhttp是一款相当经典的网络框架,它的API可以通过OkhttpClient中的CookieJar或者拦截器去管理Cookie的。

我们在构建单例OkhttpClient的时候,设置cookiejar或者拦截器,然后具体的操作(保存Cookie,取Cookie),Okhttp框架就会帮我们自动管理Cookie。
</code></pre> 
  <p><strong>4session 请求是无状态,会话才是有状态</strong></p> 
  <p>**SpringMVC使用session的两种方式</p> 
  <p>1入参 httpsession</p> 
  <p>2@sessionattribute注解与@modelattribute注解搭配,把model里面的数据放到session中**</p> 
  <pre><code class="prism language-powershell">Session是一个会话,会话就是Session。Session是对于服务端来说的,Session是服务器和客户端建立连接时添加的一个客户端连接标志,最终在服务器软件(Apache、Tomcat、JBoss)转化为一个临时的Cookie发送给客户端,当客户端第一次请求服务器时,会检查是否携带了这个Session(临时Cookie),如果没有则会添加Session,如果有就拿出这个Session来做相关操作。

那么为什么会出现session会话,它出现的机理是什么?

我们都知道,用浏览器打开一个网页,用到的是HTTP协议,了解计算机的应该都知道这个协议,它是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。所以就会带来一个问题就是,我希望几个请求的页面要有关联,比如:我在www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token operator">/</span>login里面登陆了,我在www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token operator">/</span>index 也希望是登陆状态,但是,这是2个不同的页面,也就是2个不同的HTTP请求,这2个HTTP请求是无状态的,也就是无关联的,所以无法单纯的在index中读取到它在login中已经登陆了!

那怎么办呢?方法一是这2个页面我都去登陆一遍吧,方法二是用笨方法这2个页面都去查询数据库,如果有登陆状态,就判断是登陆的了。这种查询数据库的方案虽然可行,但是每次都要去查询数据库不是个事,会造成数据库的压力。 所以正是这种不方便之处,一个新的客户端存储数据方式出现了:cookie。

cookie是把少量的信息存储在用户自己的电脑上,它在一个域名下是一个全局的,只要设置它的存储路径在域名www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com下 ,那么当用户用浏览器访问时,就可以从这个域名的任意页面读取cookie中的信息。所以就很好的解决了我在www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token operator">/</span>login页面登陆了,我也可以在www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token operator">/</span>index获取到这个登陆信息了。同时又不用反复去查询数据库。 虽然这种方案很不错,也很快速方便,但是由于cookie 是存在用户端,而且它本身存储的信息容量也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:session 诞生了。

Session 就是在一次会话中解决2次HTTP的请求的关联,让它们产生联系,让2两个页面都能读取到找个这个全局的session信息。session信息存在于服务器端,所以也就很好的解决了安全问题。

每个Session 有一个唯一的Session id。 Session的超时也是由服务器来控制。我们一般都会把Session和Cookie放在一起来说,它们具体的区别和联系这里我就不多说了,可以看上面。Cookie分为内存中Cookie(也可以说是进程中Cookie)和硬盘中Cookie。大部分的Session机制都使用进程中Cookie来保存Session id的,关闭浏览器后这个进程也就自动消失了,进程中的Cookie自然就消失了,那么Session id也跟着消失了,再次连接到服务器时也就无法找到原来的Session了。

也有使用硬盘中Cookie,比如说CSDN的“记住我一周”,或者我们的购物车信息可以在切换不同浏览器时依然可用。这就要用到我们上文提到的另一种Cookie了——硬盘中Cookie,这时Session id将长期保存在硬盘上的Cookie中,直到失效为止。
</code></pre> 
  <p><strong>5 token</strong></p> 
  <pre><code class="prism language-powershell">token是用户身份的验证方式,我们通常叫它:令牌。

最简单的token组成:

uid<span class="token punctuation">(</span>用户唯一的身份标识<span class="token punctuation">)</span>

time<span class="token punctuation">(</span>当前时间的时间戳<span class="token punctuation">)</span>

sign<span class="token punctuation">(</span>签名,由token的前几位<span class="token operator">+</span>盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器<span class="token punctuation">)</span>。

还可以把不变的参数也放进token,避免多次查库。

应用场景:

1):当用户首次登录成功(注册也是一种可以适用的场景)之后<span class="token punctuation">,</span> 服务器端就会生成一个 token 值,这个值,会在服务器保存token值<span class="token punctuation">(</span>保存在数据库中<span class="token punctuation">)</span>,再将这个token值返回给客户端<span class="token punctuation">.</span>

2):客户端拿到 token 值之后<span class="token punctuation">,</span>进行本地保存。(<span class="token function">SP</span>存储是大家能够比较支持和易于理解操作的存储)

3):当客户端再次发送网络请求<span class="token punctuation">(</span>一般不是登录请求<span class="token punctuation">)</span>的时候<span class="token punctuation">,</span>就会将这个 token 值附带到参数中发送给服务器<span class="token punctuation">.</span>

4):服务器接收到客户端的请求之后<span class="token punctuation">,</span>会取出token值与保存在本地<span class="token punctuation">(</span>数据库<span class="token punctuation">)</span>中的token值做对比

对比一:如果两个 token 值相同, 说明用户登录成功过<span class="token operator">!</span>当前用户处于登录状态<span class="token operator">!</span>

对比二:如果没有这个 token 值<span class="token punctuation">,</span> 则说明没有登录成功<span class="token punctuation">.</span>

对比三:如果 token 值不同: 说明原来的登录信息已经失效<span class="token punctuation">,</span>让用户重新登录<span class="token punctuation">.</span>
</code></pre> 
  <p><strong>6cookie和session的区别</strong><br> <a href="http://img.e-com-net.com/image/info8/a403ff0696094a30b6d0c4659fe4644a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a403ff0696094a30b6d0c4659fe4644a.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第40张图片" width="650" height="309" style="border:1px solid black;"></a><br> <strong>7session和token的区别</strong><br> <a href="http://img.e-com-net.com/image/info8/8b4622a1aa80481e8ad7cd7ceef32a7a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/8b4622a1aa80481e8ad7cd7ceef32a7a.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第41张图片" width="650" height="129" style="border:1px solid black;"></a></p> 
  <h1>五、重定向与转发</h1> 
  <p>SpringMVC默认情况下是服务器端跳转,向jsp页面中跳转,一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理;如果返回的字符串中带 forward: 或 redirect:前缀时,SpringMVC 会对他们进行特殊处理:<br> 将 forward: 和redirect: 当成指示符,其后的字符串作为 URL 来处理。<br> redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作,不经过试图解析器处理。<br> forward:success.jsp:会完成一个到 success.jsp 的转发操作。</p> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value= <span class="token punctuation">{</span><span class="token string">"/jumpOne"</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
public String jumpOne<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">return</span> <span class="token string">"forward:one.jsp"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

@RequestMapping<span class="token punctuation">(</span>value= <span class="token punctuation">{</span><span class="token string">"/jumpTwo"</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
public String jumpTwo<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
	<span class="token keyword">return</span> <span class="token string">"redirect:two.jsp"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p>总结:</p> 
  <pre><code class="prism language-powershell">1<span class="token punctuation">.</span>从地址栏显示来说
forward是服务器请求资源<span class="token punctuation">,</span>服务器直接访问目标地址的URL<span class="token punctuation">,</span>把那个URL的响应内容读取过来<span class="token punctuation">,</span>然后把这些内容再发给浏览器<span class="token punctuation">.</span>浏览器根本不知道服务器发送的内容从哪里来的<span class="token punctuation">,</span>所以它的地址栏还是原来的地址
redirect是服务端根据逻辑<span class="token punctuation">,</span>发送一个状态码<span class="token punctuation">,</span>告诉浏览器重新去请求那个地址<span class="token punctuation">.</span>所以地址栏显示的是新的URL
2<span class="token punctuation">.</span>从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据
redirect:不能共享数据
3<span class="token punctuation">.</span>从运用地方来说
forward:一般用于用户登陆的时候<span class="token punctuation">,</span>根据角色转发到相应的模块
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
4<span class="token punctuation">.</span>从效率来说
forward:高
redirect:低
</code></pre> 
  <h1>六、mvc:annotation-driven</h1> 
  <h2>1mvc:annotation-driven/注解简介</h2> 
  <p>mvc:annotation-driven/注解的作用?</p> 
  <p><mvc:annotation-driven /> 注解会自动注册</p> 
  <p><code>RequestMappingHandlerMapping</code>、<code>RequestMappingHandlerAdapter</code> 与<br> <code>ExceptionHandlerExceptionResolver</code> 三个bean。</p> 
  <p>还将提供以下支持:<br> 支持使用 ConversionService 实例对表单参数进行类型转换<br> 支持使用 @NumberFormat annotation、@DateTimeFormat注解完成数据类型的格式化<br> 支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证<br> 支持使用 @RequestBody 和 @ResponseBody 注解(json序列化)。<br> 比如直接使用@ResponseBody时,报Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p> 
  <p>导入命名空间:<br> <a href="http://img.e-com-net.com/image/info8/5aa7f67be7d343d899fa93dae96632e5.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/5aa7f67be7d343d899fa93dae96632e5.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第42张图片" width="650" height="328" style="border:1px solid black;"></a></p> 
  <h2>2java各种类型对象转换json @ResponseBody 该注解导致无法跳转</h2> 
  <pre><code class="prism language-powershell">jackson<span class="token operator">-</span>annotations<span class="token operator">-</span>2<span class="token punctuation">.</span>9<span class="token punctuation">.</span>0<span class="token punctuation">.</span>jar,
jackson<span class="token operator">-</span>core<span class="token operator">-</span>2<span class="token punctuation">.</span>9<span class="token punctuation">.</span>0<span class="token punctuation">.</span>jar,
jackson<span class="token operator">-</span>databind<span class="token operator">-</span>2<span class="token punctuation">.</span>9<span class="token punctuation">.</span>0<span class="token punctuation">.</span>jar
</code></pre> 
  <p>添加依赖:</p> 
  <pre><code class="prism language-powershell"><<span class="token operator">!</span>-<span class="token operator">-</span><span class="token keyword">data</span>-<span class="token operator">-</span>>
<dependency>
    <groupId>com<span class="token punctuation">.</span>fasterxml<span class="token punctuation">.</span>jackson<span class="token punctuation">.</span>core<<span class="token operator">/</span>groupId>
    <artifactId>jackson<span class="token operator">-</span>databind<<span class="token operator">/</span>artifactId>
    <version>2<span class="token punctuation">.</span>9<span class="token punctuation">.</span>0<<span class="token operator">/</span>version>
<<span class="token operator">/</span>dependency>
<<span class="token operator">!</span>-<span class="token operator">-</span> https:<span class="token operator">/</span><span class="token operator">/</span>mvnrepository<span class="token punctuation">.</span>com<span class="token operator">/</span>artifact<span class="token operator">/</span>com<span class="token punctuation">.</span>fasterxml<span class="token punctuation">.</span>jackson<span class="token punctuation">.</span>core<span class="token operator">/</span>jackson<span class="token operator">-</span>core <span class="token operator">--</span>>
<dependency>
    <groupId>com<span class="token punctuation">.</span>fasterxml<span class="token punctuation">.</span>jackson<span class="token punctuation">.</span>core<<span class="token operator">/</span>groupId>
    <artifactId>jackson<span class="token operator">-</span>core<<span class="token operator">/</span>artifactId>
    <version>2<span class="token punctuation">.</span>9<span class="token punctuation">.</span>0<<span class="token operator">/</span>version>
<<span class="token operator">/</span>dependency>
<<span class="token operator">!</span>-<span class="token operator">-</span> https:<span class="token operator">/</span><span class="token operator">/</span>mvnrepository<span class="token punctuation">.</span>com<span class="token operator">/</span>artifact<span class="token operator">/</span>com<span class="token punctuation">.</span>fasterxml<span class="token punctuation">.</span>jackson<span class="token punctuation">.</span>core<span class="token operator">/</span>jackson<span class="token operator">-</span>annotations <span class="token operator">--</span>>
<dependency>
    <groupId>com<span class="token punctuation">.</span>fasterxml<span class="token punctuation">.</span>jackson<span class="token punctuation">.</span>core<<span class="token operator">/</span>groupId>
    <artifactId>jackson<span class="token operator">-</span>annotations<<span class="token operator">/</span>artifactId>
    <version>2<span class="token punctuation">.</span>9<span class="token punctuation">.</span>0<<span class="token operator">/</span>version>
<<span class="token operator">/</span>dependency>
</code></pre> 
  <p>方法声明:把一个对象转换成json<br> @RequestMapping("/jsonObj")<br> @ResponseBody//该方法的返回值会被转换成json<br> public DeptEntity objToJson() {<br> DeptEntity dept = new DeptEntity();<br> dept.setDno(5000);<br> dept.setDname(“采买部”);<br> dept.setDloc(“天津”);<br> return dept;<br> }</p> 
  <p>方法声明:把一个Listd对象转换成json<br> @RequestMapping("/jl")<br> @ResponseBody<br> public List jsonList() throws Exception {<br> List list=new ArrayList();<br> DeptEntity dept =new DeptEntity();<br> dept.setDno(300);<br> dept.setDname(“scott”);<br> dept.setDloc(“北京”);</p> 
  <pre><code>	DeptEntity dept1 =new DeptEntity();
	dept1.setDno(400);
	dept1.setDname("tiger");
	dept1.setDloc("上海");
	
	list.add(dept);
	list.add(dept1);
	return list;
}
</code></pre> 
  <p>例子如下:<br> 1String转json<br> <a href="http://img.e-com-net.com/image/info8/dbb3b381d0b0473aa68fc39ef8023330.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/dbb3b381d0b0473aa68fc39ef8023330.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第43张图片" width="558" height="151" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/5e260330a4e246c6a5dc9721f4268e9d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/5e260330a4e246c6a5dc9721f4268e9d.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第44张图片" width="650" height="321" style="border:1px solid black;"></a><br> 2model转json</p> 
  <p><a href="http://img.e-com-net.com/image/info8/379637abf1674c1193aec9b1d7ff1039.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/379637abf1674c1193aec9b1d7ff1039.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第45张图片" width="578" height="194" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/961dfc745967430997436c13f522d1eb.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/961dfc745967430997436c13f522d1eb.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第46张图片" width="650" height="333" style="border:1px solid black;"></a><br> 3List转json<br> <a href="http://img.e-com-net.com/image/info8/b73afac7962d46669bc167588e0c08a0.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b73afac7962d46669bc167588e0c08a0.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第47张图片" width="576" height="392" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/036e9cb7c32f4717bcf00e4d99d7e24a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/036e9cb7c32f4717bcf00e4d99d7e24a.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第48张图片" width="650" height="303" style="border:1px solid black;"></a><br> 4map转json<br> <a href="http://img.e-com-net.com/image/info8/a09a126efb4d4ed483b781470c541c18.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a09a126efb4d4ed483b781470c541c18.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第49张图片" width="650" height="391" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/a941fcf5dc1543a88d288b06c762bf18.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a941fcf5dc1543a88d288b06c762bf18.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第50张图片" width="650" height="324" style="border:1px solid black;"></a></p> 
  <h2>3使用fastjson转json(了解)</h2> 
  <p>导入依赖:</p> 
  <pre><code class="prism language-powershell"><<span class="token operator">!</span>-<span class="token operator">-</span> https:<span class="token operator">/</span><span class="token operator">/</span>mvnrepository<span class="token punctuation">.</span>com<span class="token operator">/</span>artifact<span class="token operator">/</span>com<span class="token punctuation">.</span>alibaba<span class="token operator">/</span>fastjson <span class="token operator">--</span>>
<dependency>
    <groupId>com<span class="token punctuation">.</span>alibaba<<span class="token operator">/</span>groupId>
    <artifactId>fastjson<<span class="token operator">/</span>artifactId>
    <version>1<span class="token punctuation">.</span>2<span class="token punctuation">.</span>40<<span class="token operator">/</span>version>
<<span class="token operator">/</span>dependency>
</code></pre> 
  <p>测试方法:</p> 
  <pre><code class="prism language-powershell">@RequestMapping<span class="token punctuation">(</span>value= <span class="token punctuation">{</span><span class="token string">"/fastJson"</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
	public void  fastJson<span class="token punctuation">(</span>HttpServletResponse response<span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token operator">/</span><span class="token operator">/</span>设置响应类型
		response<span class="token punctuation">.</span>setContentType<span class="token punctuation">(</span><span class="token string">"application/json; charset=utf-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token operator">/</span><span class="token operator">/</span>设置页面不缓存
		response<span class="token punctuation">.</span>setHeader<span class="token punctuation">(</span><span class="token string">"Pragma"</span><span class="token punctuation">,</span> <span class="token string">"No-cache"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		response<span class="token punctuation">.</span>setHeader<span class="token punctuation">(</span><span class="token string">"Cache-Control"</span><span class="token punctuation">,</span> <span class="token string">"no-cache"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token operator">/</span><span class="token operator">/</span>
		DeptForm dept=new DeptForm<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		dept<span class="token punctuation">.</span>setDeptno<span class="token punctuation">(</span>100<span class="token punctuation">)</span><span class="token punctuation">;</span>
		dept<span class="token punctuation">.</span>setDname<span class="token punctuation">(</span><span class="token string">"大数据100部"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		dept<span class="token punctuation">.</span>setLoc<span class="token punctuation">(</span><span class="token string">"阿里巴巴"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token operator">/</span><span class="token operator">/</span>JsonUtil<span class="token punctuation">.</span>toJson<span class="token punctuation">(</span>response<span class="token punctuation">,</span> dept<span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token keyword">try</span> <span class="token punctuation">{</span>
			<span class="token operator">/</span><span class="token operator">/</span>把object转json
			String json=JSON<span class="token punctuation">.</span>toJSONString<span class="token punctuation">(</span>dept<span class="token punctuation">)</span><span class="token punctuation">;</span>
			PrintWriter out =response<span class="token punctuation">.</span>getWriter<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			out<span class="token punctuation">.</span>println<span class="token punctuation">(</span>json<span class="token punctuation">)</span><span class="token punctuation">;</span>
			out<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>IOException e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
			e<span class="token punctuation">.</span>printStackTrace<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token punctuation">}</span>
	<span class="token punctuation">}</span>
</code></pre> 
  <p>工具类:<code>JsonHelper、JsonUtil</code></p> 
  <h2>4json转java对象@requestbody</h2> 
  <pre><code class="prism language-powershell">1<span class="token punctuation">.</span>@requestBody注解常用来处理content<span class="token operator">-</span><span class="token function">type</span>不是默认的application<span class="token operator">/</span>x<span class="token operator">-</span>www<span class="token operator">-</span>form<span class="token operator">-</span>urlcoded编码的内容,比如说:application<span class="token operator">/</span>json或者是application<span class="token operator">/</span>xml等。一般情况下来说常用其来处理application<span class="token operator">/</span>json类型。
2<span class="token punctuation">.</span>通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。

</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/20c41635006c44ea8cad0d7485408e6e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/20c41635006c44ea8cad0d7485408e6e.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第51张图片" width="625" height="184" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/207680dfab12450cab2df0b8d7c12e78.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/207680dfab12450cab2df0b8d7c12e78.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第52张图片" width="650" height="360" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/443cae028997424eba4e65efcc8ca3b5.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/443cae028997424eba4e65efcc8ca3b5.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第53张图片" width="650" height="154" style="border:1px solid black;"></a></p> 
  <h1>七 全局异常处理器的开发(公共模块)</h1> 
  <pre><code class="prism language-powershell">java把异常作为一种类,当做对象来处理。
所有异常类的基类是Throwable类
两大子类分别是Error和Exception。

系统错误由Java虚拟机抛出,用Error类表示。Error类描述的是内部系统错误,例如Java虚拟机崩溃。这种情况仅凭程序自身是无法处理的,在程序中也不会对Error异常进行捕捉和抛出。

异常(Exception)又分为RuntimeException<span class="token punctuation">(</span>运行时异常<span class="token punctuation">)</span>和CheckedException<span class="token punctuation">(</span>检查时异常<span class="token punctuation">)</span>,两者区别如下:

RuntimeException:程序运行过程中才可能发生的异常。一般为代码的逻辑错误。例如:类型错误转换,数组下标访问越界,空指针异常、找不到指定类等等。
CheckedException:编译期间可以检查到的异常,必须显式的进行处理(捕获或者抛出到上一层)。例如:IOException<span class="token punctuation">,</span> FileNotFoundException等等。
</code></pre> 
  <p>springmvc提供一个<code>HandlerExceptionResolver</code>接口,自定义全局异常处理器必须要实现这个接口。<a href="http://img.e-com-net.com/image/info8/cb847973967f4718a89133104f2fd9c9.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/cb847973967f4718a89133104f2fd9c9.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第54张图片" width="553" height="440" style="border:1px solid black;"></a></p> 
  <h2>1自定义异常</h2> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>exception<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>16<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
public <span class="token keyword">class</span> CustomException extends RuntimeException <span class="token punctuation">{</span>
    <span class="token operator">/</span><span class="token operator">/</span>描述异常信息
    public String message<span class="token punctuation">;</span>
    public CustomException<span class="token punctuation">(</span>String message<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token operator">/</span><span class="token operator">/</span>调用父类的构造方法
        super<span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
        this<span class="token punctuation">.</span>message = message<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    @Override
    public String getMessage<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> message<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>


<span class="token punctuation">}</span>

</code></pre> 
  <h2>2自定义全局异常处理器</h2> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>exception<span class="token punctuation">;</span>

import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>HandlerExceptionResolver<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>ModelAndView<span class="token punctuation">;</span>

import javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span>HttpServletRequest<span class="token punctuation">;</span>
import javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span>HttpServletResponse<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>16<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
public <span class="token keyword">class</span> CustomExceptionResolver implements HandlerExceptionResolver <span class="token punctuation">{</span>
    @Override
    public ModelAndView resolveException<span class="token punctuation">(</span>HttpServletRequest httpServletRequest<span class="token punctuation">,</span> HttpServletResponse httpServletResponse<span class="token punctuation">,</span> Object handler<span class="token punctuation">,</span> Exception e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token operator">/</span><span class="token operator">/</span>java多态
        RuntimeException c =null<span class="token punctuation">;</span>
        <span class="token operator">/</span><span class="token operator">/</span>如果抛出的是系统自定义的异常则直接转换
        <span class="token keyword">if</span><span class="token punctuation">(</span>e instanceof RuntimeException<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token operator">/</span><span class="token operator">/</span>java多态
             c = new CustomException<span class="token punctuation">(</span>e<span class="token punctuation">.</span>toString<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
             <span class="token operator">/</span><span class="token operator">/</span>打印异常类型
             System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"系统已知错误:"</span><span class="token operator">+</span><span class="token string">"\n"</span><span class="token operator">+</span>c<span class="token punctuation">.</span>getMessage<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
             <span class="token operator">/</span><span class="token operator">/</span>打印异常信息
             System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"异常信息如下:"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
             e<span class="token punctuation">.</span>printStackTrace<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            c = new CustomException<span class="token punctuation">(</span><span class="token string">"系统未知错误"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span>c<span class="token punctuation">.</span>getMessage<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token operator">/</span><span class="token operator">/</span>向前台返回错误信息
        ModelAndView modelAndView = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>addObject<span class="token punctuation">(</span><span class="token string">"exceptionmessage"</span><span class="token punctuation">,</span> c<span class="token punctuation">.</span>getMessage<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token operator">/</span><span class="token operator">/</span>页面转发exception<span class="token punctuation">.</span>jsp的内容<span class="token punctuation">,</span>地址栏中的地址不变<span class="token punctuation">.</span>
        modelAndView<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"exception"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        
        <span class="token keyword">return</span> modelAndView<span class="token punctuation">;</span>

    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>


</code></pre> 
  <h2>3配置全局异常处理器</h2> 
  <pre><code class="prism language-powershell"> <<span class="token operator">!</span>-<span class="token operator">-</span>在springmvc配置文件中配置项目的全局异常<span class="token operator">--</span>>
    <bean <span class="token keyword">class</span>=<span class="token string">"baobaobaobao.exception.CustomExceptionResolver"</span>><<span class="token operator">/</span>bean>
</code></pre> 
  <h2>4测试</h2> 
  <p>我们来自己设置一个异常来测试全局异常控制器是否起作用<br> 例如撤销entity层的无参构造方法来模拟构造器异常</p> 
  <p>会出现异常的实体类:<br> <a href="http://img.e-com-net.com/image/info8/1385985fc7674fd0a8dbb2ee2566935a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/1385985fc7674fd0a8dbb2ee2566935a.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第55张图片" width="650" height="220" style="border:1px solid black;"></a><br> dao层:</p> 
  <pre><code>package baobaobaobao.dao;

import baobaobaobao.entity.EnUser;

import java.util.List;

/**
 * Created by @author LiuChunhang on 2020/4/6.
 */
public interface EnuserDaoo {

    public int  insertone(EnUser enuser);
    public List<EnUser> selectall();
}
</code></pre> 
  <p>service层</p> 
  <pre><code>package baobaobaobao.service;

import baobaobaobao.entity.EnUser;

import java.util.List;

/**
 * Created by @author LiuChunhang on 2020/4/14.
 */
public interface SSMServiceface {
    public List<EnUser> Selectinsert(EnUser enUser);
    //插入成功并查询的业务
}

</code></pre> 
  <pre><code>package baobaobaobao.service;

import baobaobaobao.dao.EnuserDaoo;
import baobaobaobao.entity.EnUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Created by @author LiuChunhang on 2020/4/14.
 */
@Service
public class SSMService implements SSMServiceface {
    @Autowired
    public EnuserDaoo enuserDaoo;

    public EnuserDaoo getEnuserDaoo() {
        return enuserDaoo;
    }

    public void setEnuserDaoo(EnuserDaoo enuserDaoo) {
        this.enuserDaoo = enuserDaoo;
    }

    @Override
    @Transactional //事务管理
    public List<EnUser> Selectinsert(EnUser enUser) {
        if (enuserDaoo.insertone(enUser)>0){
            List<EnUser> selectall = enuserDaoo.selectall();
            System.out.println("插入成功并查询");
            for(EnUser list:selectall){
                System.out.println(list);
            }

            return enuserDaoo.selectall();
        }else {
            System.out.println("插入失败");
            return null;
        }

    }
}

</code></pre> 
  <p>controller层:</p> 
  <pre><code>package baobaobaobao.controller;

import baobaobaobao.entity.EnUser;
import baobaobaobao.service.SSMServiceface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Created by @author LiuChunhang on 2020/4/14.
 */
@RestController //该类下的所有方法返回json值@restcontroller=controller+responsebody,依然限制不会跳转,直接返回json数据
public class ExceptionController {
    @Autowired
    public SSMServiceface ssmService;  //必须遵从java的多态,需用使用接口名的引用,否则会报异常

    public SSMServiceface getSsmService() {
        return ssmService;
    }

    public void setSsmService(SSMServiceface ssmService) {
        this.ssmService = ssmService;
    }




    @RequestMapping(value = "xiaohang",method = {RequestMethod.GET,RequestMethod.POST})
    public List<EnUser> SSMtest (){
        EnUser enUser = new EnUser(2322,"333333","1998","222222",0);
        List<EnUser> list = ssmService.Selectinsert(enUser);
        return list;

    }

}


</code></pre> 
  <p>浏览器无构造器异常测试:<br> <a href="http://img.e-com-net.com/image/info8/3b7345ab2777460d98814273904be8ff.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3b7345ab2777460d98814273904be8ff.jpg" alt="在这里插入图片描述" width="650" height="82"></a></p> 
  <p>浏览器有构造器异常测试(地址栏不变):<br> <a href="http://img.e-com-net.com/image/info8/2961eff251d641f68b507157790cd483.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2961eff251d641f68b507157790cd483.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第56张图片" width="650" height="168" style="border:1px solid black;"></a><br> 构造器异常信息在控制器中打印:<br> <a href="http://img.e-com-net.com/image/info8/27453b18572a4635a8cdd4b5d5ca779c.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/27453b18572a4635a8cdd4b5d5ca779c.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第57张图片" width="650" height="302" style="border:1px solid black;"></a></p> 
  <h1>八自定义处理器拦截器</h1> 
  <p>**Spring Web MVC 的处理器拦截器(即拦截器)类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理,</p> 
  <h2>注意:拦截器只针对tomcat项目根路径目录下的URL起着拦截作用!!!</h2> 
  <p>。<br> 拦截器通常一般指的是通过拦截从浏览器发往服务器的一些请求来完成某些功能的一段程序代码一般在一个请求发生之前,发生时,发生后我们都可以对请求进行拦截。**</p> 
  <h2>1、常见应用场景</h2> 
  <pre><code class="prism language-powershell">1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View,访问量)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache 可以自动记录);
4、通用行为:读取cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
</code></pre> 
  <h2>2、拦截器接口HandlerInterceptor</h2> 
  <pre><code class="prism language-powershell">public interface HandlerInterceptor <span class="token punctuation">{</span>
boolean preHandle<span class="token punctuation">(</span>HttpServletRequest request<span class="token punctuation">,</span> HttpServletResponse response<span class="token punctuation">,</span>Object handler<span class="token punctuation">)</span>throws Exception<span class="token punctuation">;</span>

void postHandle<span class="token punctuation">(</span>HttpServletRequest request<span class="token punctuation">,</span> HttpServletResponse response<span class="token punctuation">,</span>Object handler<span class="token punctuation">,</span> ModelAndView modelAndView<span class="token punctuation">)</span>throws Exception<span class="token punctuation">;</span>

void afterCompletion<span class="token punctuation">(</span>HttpServletRequest request<span class="token punctuation">,</span> HttpServletResponse response<span class="token punctuation">,</span>Object handler<span class="token punctuation">,</span> Exception ex<span class="token punctuation">)</span>throws Exception<span class="token punctuation">;</span>

<span class="token punctuation">}</span>
</code></pre> 
  <p><code>preHandle</code>:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(Controller 实现);<br> 返回值:<br> <code>true</code>:表示继续流程(如调用下一个拦截器或处理器);<br> <code>false</code>:表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;<br> <code>postHandle</code>:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。<br> <code>afterCompletion</code>:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle<br> 返回true的拦截器的afterCompletion。</p> 
  <h2>3、拦截器适配器</h2> 
  <p>有时候我们可能只需要实现三个回调方法中的某一个,如果实现HandlerInterceptor 接口的话,三个方法必须实现,不管你需不需要,此时spring 提供了一个HandlerInterceptorAdapter 适配器(一种适配器设计模式的实现),允许我们只实现需要的回调方法。</p> 
  <p><a href="http://img.e-com-net.com/image/info8/641ed3e99b0a4d92bbfc6ebdd2a6d881.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/641ed3e99b0a4d92bbfc6ebdd2a6d881.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第58张图片" width="430" height="279" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/19c45577d0d542c59d52bee8e1fa21b4.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/19c45577d0d542c59d52bee8e1fa21b4.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第59张图片" width="436" height="240" style="border:1px solid black;"></a></p> 
  <h2>4、实现登录拦截</h2> 
  <p>如果用户没有登录,不允许访问update、delete、insert、select</p> 
  <pre><code class="prism language-powershell">package baobaobaobao<span class="token punctuation">.</span>interceptor<span class="token punctuation">;</span>

import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>HandlerInterceptor<span class="token punctuation">;</span>
import org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>web<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>ModelAndView<span class="token punctuation">;</span>

import javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span>HttpServletRequest<span class="token punctuation">;</span>
import javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span>HttpServletResponse<span class="token punctuation">;</span>
import javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span>HttpSession<span class="token punctuation">;</span>

<span class="token operator">/</span>*<span class="token operator">*</span>
 <span class="token operator">*</span> Created by @author LiuChunhang on 2020<span class="token operator">/</span>4<span class="token operator">/</span>15<span class="token punctuation">.</span>
 <span class="token operator">*</span><span class="token operator">/</span>
<span class="token operator">/</span><span class="token operator">/</span>自定义拦截器
public <span class="token keyword">class</span> LoginInterceptor implements HandlerInterceptor <span class="token punctuation">{</span>
    @Override
    public boolean preHandle<span class="token punctuation">(</span>HttpServletRequest httpServletRequest<span class="token punctuation">,</span> HttpServletResponse httpServletResponse<span class="token punctuation">,</span> Object o<span class="token punctuation">)</span> throws Exception <span class="token punctuation">{</span>
        <span class="token operator">/</span><span class="token operator">/</span> 获取请求路径
        String uri = httpServletRequest<span class="token punctuation">.</span>getRequestURI<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span>uri<span class="token punctuation">.</span>contains<span class="token punctuation">(</span><span class="token string">"login"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token operator">/</span><span class="token operator">/</span> 登录操作
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"uri包含login,放行."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span> true<span class="token punctuation">;</span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><span class="token operator">/</span><span class="token operator">/</span> 非登录操作,需要验证是否登录过
            <span class="token operator">/</span><span class="token operator">/</span> 1表示已经登录 0表示未登录
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"uri不包含login"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            HttpSession session = httpServletRequest<span class="token punctuation">.</span>getSession<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            String attribute = <span class="token punctuation">(</span>String<span class="token punctuation">)</span> session<span class="token punctuation">.</span>getAttribute<span class="token punctuation">(</span><span class="token string">"status"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"登录状态:"</span><span class="token operator">+</span>attribute<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">.</span>equals<span class="token punctuation">(</span>attribute<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                <span class="token keyword">return</span> true<span class="token punctuation">;</span>
            <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{</span>
                System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"uri:"</span><span class="token operator">+</span>uri<span class="token operator">+</span><span class="token string">"\n"</span><span class="token operator">+</span><span class="token string">"拦截器①已拦截"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                httpServletResponse<span class="token punctuation">.</span>sendRedirect<span class="token punctuation">(</span><span class="token string">"login"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">return</span> false<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>

    <span class="token punctuation">}</span>


    @Override
    public void postHandle<span class="token punctuation">(</span>HttpServletRequest httpServletRequest<span class="token punctuation">,</span> HttpServletResponse httpServletResponse<span class="token punctuation">,</span> Object o<span class="token punctuation">,</span> ModelAndView modelAndView<span class="token punctuation">)</span> throws Exception <span class="token punctuation">{</span>

    <span class="token punctuation">}</span>

    @Override
    public void afterCompletion<span class="token punctuation">(</span>HttpServletRequest httpServletRequest<span class="token punctuation">,</span> HttpServletResponse httpServletResponse<span class="token punctuation">,</span> Object o<span class="token punctuation">,</span> Exception e<span class="token punctuation">)</span> throws Exception <span class="token punctuation">{</span>

    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>


</code></pre> 
  <p>5、配置拦截器<br> 案例:</p> 
  <pre><code class="prism language-powershell">  <<span class="token operator">!</span>-<span class="token operator">-</span> 配置拦截器<span class="token punctuation">(</span>多个<span class="token punctuation">)</span> <span class="token operator">--</span>>
    <mvc:interceptors>
        <<span class="token operator">!</span>-<span class="token operator">-</span> 配置1个拦截器 <span class="token operator">--</span>>
        <mvc:interceptor>
            <<span class="token operator">!</span>-<span class="token operator">-</span> 拦截路径 <span class="token operator">--</span>>
            <mvc:mapping path=<span class="token string">"/**/*"</span> <span class="token operator">/</span>>
            <<span class="token operator">!</span>-<span class="token operator">-</span> 排除拦截 <span class="token operator">--</span>>
            <mvc:exclude<span class="token operator">-</span>mapping path=<span class="token string">"/**/*.js"</span><span class="token operator">/</span>>
            <mvc:exclude<span class="token operator">-</span>mapping path=<span class="token string">"/**/*.css"</span><span class="token operator">/</span>>
            <mvc:exclude<span class="token operator">-</span>mapping path=<span class="token string">"/**/*.pnf"</span><span class="token operator">/</span>>
            <mvc:exclude<span class="token operator">-</span>mapping path=<span class="token string">"/**/*.jpg"</span><span class="token operator">/</span>>
            <mvc:exclude<span class="token operator">-</span>mapping path=<span class="token string">"/**/*.ico"</span><span class="token operator">/</span>>
            <mvc:exclude<span class="token operator">-</span>mapping path=<span class="token string">"/**/font/*"</span><span class="token operator">/</span>>
            <bean <span class="token keyword">class</span>=<span class="token string">"baobaobaobao.interceptor.LoginInterceptor"</span>><<span class="token operator">/</span>bean>
        <<span class="token operator">/</span>mvc:interceptor>
        <<span class="token operator">!</span>-<span class="token operator">-</span> 配置2个拦截器<span class="token punctuation">(</span>备用<span class="token punctuation">)</span> <span class="token operator">--</span>>
        <mvc:interceptor>
            <<span class="token operator">!</span>-<span class="token operator">-</span> 拦截路径 <span class="token operator">--</span>>
            <mvc:mapping path=<span class="token string">"/"</span> <span class="token operator">/</span>>
            <<span class="token operator">!</span>-<span class="token operator">-</span> 排除拦截 <span class="token operator">--</span>>
            <mvc:exclude<span class="token operator">-</span>mapping path=<span class="token string">"/"</span><span class="token operator">/</span>>
            <bean <span class="token keyword">class</span>=<span class="token string">"baobaobaobao.interceptor.XInterceptor"</span>><<span class="token operator">/</span>bean>
        <<span class="token operator">/</span>mvc:interceptor>
    <<span class="token operator">/</span>mvc:interceptors>

</code></pre> 
  <p>6测试</p> 
  <pre><code class="prism language-powershell"> @RequestMapping<span class="token punctuation">(</span>value = <span class="token string">"index"</span><span class="token punctuation">,</span>method = <span class="token punctuation">{</span>RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">,</span>RequestMethod<span class="token punctuation">.</span>POST<span class="token punctuation">}</span><span class="token punctuation">)</span>
    public String test<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"开始请求index页面"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span>println<span class="token punctuation">(</span><span class="token string">"啦啦啦啦啦啦啦啦啦啦"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token string">"temp"</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre> 
  <pre><code class="prism language-powershell">   @RequestMapping<span class="token punctuation">(</span>value = <span class="token string">"login"</span><span class="token punctuation">,</span>method = <span class="token punctuation">{</span>RequestMethod<span class="token punctuation">.</span>GET<span class="token punctuation">,</span>RequestMethod<span class="token punctuation">.</span>POST<span class="token punctuation">}</span><span class="token punctuation">)</span>
    public ModelAndView login<span class="token punctuation">(</span>HttpSession httpSession<span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token operator">/</span><span class="token operator">/</span>登录之后设置登录状态<span class="token punctuation">,</span>也可以设置session过期时长
        httpSession<span class="token punctuation">.</span>setAttribute<span class="token punctuation">(</span><span class="token string">"status"</span><span class="token punctuation">,</span> <span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        ModelAndView modelAndView = new ModelAndView<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        modelAndView<span class="token punctuation">.</span>setViewName<span class="token punctuation">(</span><span class="token string">"login"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> modelAndView<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/a921d003ea96444182ef21ad1793af19.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a921d003ea96444182ef21ad1793af19.jpg" alt="在这里插入图片描述" width="650" height="59"></a><br> 因为检测到没有登录,所以<strong>访问控制器映射的 uri(mvc/index),会被拦截器拦截,重定向到mvc/login:</strong><br> <a href="http://img.e-com-net.com/image/info8/51b3ffde441e447f804fb9c8a5eedabe.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/51b3ffde441e447f804fb9c8a5eedabe.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第60张图片" width="650" height="103" style="border:1px solid black;"></a><br> 控制器打印<br> <a href="http://img.e-com-net.com/image/info8/c4ff145fa5664002a1218f9d037b8bc7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c4ff145fa5664002a1218f9d037b8bc7.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第61张图片" width="547" height="281" style="border:1px solid black;"></a></p> 
  <h1>九处理静态资源</h1> 
  <p>优雅的 REST 风格的资源URL 不希望带 .html 或 .do 等后缀若将 DispatcherServlet 请求映射配置为 /,则 Spring MVC 将捕获WEB 容器的所有请求,包括静态资源的请求, SpringMVC 会将他们当成一个普通请求处理,因找不到对应处理器将导致错误。<br> 需要配置标签mvc:annotation-driven</mvc:annotation-driven><br> 1.静态资源在webapp下</p> 
  <pre><code class="prism language-powershell"><mvc:resources location=<span class="token string">"/images/"</span>  mapping=<span class="token string">"/images/**"</span> <span class="token operator">/</span>>
<mvc:resources location=<span class="token string">"/js/"</span>  mapping=<span class="token string">"/js/**"</span> <span class="token operator">/</span>>
</code></pre> 
  <p>说明:<br> location元素:表示webapp目录下(即服务器根目录)的images包下的所有文件;<br> mapping元素:表示以/images开头的所有请求路径,如/images/a 或者/images/a/b<br> 2.静态资源在resources下(idea下maven环境)</p> 
  <pre><code class="prism language-powershell"><mvc:resources mapping=<span class="token string">"/images/**"</span> location=<span class="token string">"classpath:images/"</span> <span class="token operator">/</span>>
<mvc:resources mapping=<span class="token string">"/js/**"</span> location=<span class="token string">"classpath:js/"</span> <span class="token operator">/</span>>
</code></pre> 
  <ol start="3"> 
   <li>页面访问,例如拦截器拦截请求跳转到 login.jsp页面,如果没有配置静态资源映射,那么系统将访问不到静态资源请求.</li> 
  </ol> 
  <p>login.jsp</p> 
  <pre><code class="prism language-powershell"> <link rel=<span class="token string">"stylesheet"</span> <span class="token function">type</span>=<span class="token string">"text/css"</span> href=<span class="token string">"layui/css/layui.css"</span> media=<span class="token string">"all"</span>>
 <link rel=<span class="token string">"stylesheet"</span> <span class="token function">type</span>=<span class="token string">"text/css"</span> href=<span class="token string">"css/login.css"</span> media=<span class="token string">"all"</span>>
 <script <span class="token function">type</span>=<span class="token string">"text/javascript"</span> src=<span class="token string">"layui/lay/dest/layui.all.js"</span>><<span class="token operator">/</span>script> 
 <script <span class="token function">type</span>=<span class="token string">"text/javascript"</span> src=<span class="token string">"js/login.js"</span>><<span class="token operator">/</span>script>
 <script <span class="token function">type</span>=<span class="token string">"text/javascript"</span> src=<span class="token string">"js/jparticle.jquery.js"</span>><<span class="token operator">/</span>script>  
</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/c908a48fe9d0453fb4089afcac8aa1fc.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c908a48fe9d0453fb4089afcac8aa1fc.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第62张图片" width="650" height="295" style="border:1px solid black;"></a><br> 4. 页面访问,例如拦截器拦截请求跳转到 login.jsp页面,如果配置静态资源映射,那么系统将能使用静态资源渲染请求页面,.<br> login.jsp</p> 
  <pre><code class="prism language-powershell"> <link rel=<span class="token string">"stylesheet"</span> <span class="token function">type</span>=<span class="token string">"text/css"</span> href=<span class="token string">"layui/css/layui.css"</span> media=<span class="token string">"all"</span>>
 <link rel=<span class="token string">"stylesheet"</span> <span class="token function">type</span>=<span class="token string">"text/css"</span> href=<span class="token string">"css/login.css"</span> media=<span class="token string">"all"</span>>
 <script <span class="token function">type</span>=<span class="token string">"text/javascript"</span> src=<span class="token string">"layui/lay/dest/layui.all.js"</span>><<span class="token operator">/</span>script> 
 <script <span class="token function">type</span>=<span class="token string">"text/javascript"</span> src=<span class="token string">"js/login.js"</span>><<span class="token operator">/</span>script>
 <script <span class="token function">type</span>=<span class="token string">"text/javascript"</span> src=<span class="token string">"js/jparticle.jquery.js"</span>><<span class="token operator">/</span>script>  
</code></pre> 
  <pre><code class="prism language-powershell"> <<span class="token operator">!</span>-<span class="token operator">-</span>配置静态资源的请求<span class="token operator">--</span>>
    <mvc:resources mapping=<span class="token string">"/img/**"</span>   location=<span class="token string">"/img/"</span>   > <<span class="token operator">/</span>mvc:resources>
    <mvc:resources mapping=<span class="token string">"/js/**"</span>    location=<span class="token string">"/js/"</span>   ><<span class="token operator">/</span>mvc:resources>
    <mvc:resources mapping=<span class="token string">"/layui/**"</span> location=<span class="token string">"/layui/"</span>><<span class="token operator">/</span>mvc:resources>
    <mvc:resources mapping=<span class="token string">"/css/**"</span> location=<span class="token string">"/css/"</span>><<span class="token operator">/</span>mvc:resources>

</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/e692c8518fec4744a8de76b73b022c69.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e692c8518fec4744a8de76b73b022c69.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第63张图片" width="650" height="335" style="border:1px solid black;"></a></p> 
  <h1>十 springMVC实现restful风格架构</h1> 
  <h2>1什么是restful架构</h2> 
  <p>RESTful架构风格规定,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。<br> HTTP1.1协议中定义了8中请求类型:</p> 
  <pre><code class="prism language-powershell">OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送<span class="token string">'*'</span>的请求来测试服务器的功能性。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET:向特定的资源发出请求。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和<span class="token operator">/</span>或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request<span class="token operator">-</span>URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP<span class="token operator">/</span>1<span class="token punctuation">.</span>1协议中预留给能够将连接改为管道方式的代理服务器。
</code></pre> 
  <p>在HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。<br> 它们分别对应四种基本操作:</p> 
  <pre><code class="prism language-powershell">1、GET  ====== 获取资源
2、POST  ====== 新建资源
3、PUT   ====== 更新资源
4、DELETE====== 删除资源
</code></pre> 
  <h2>2资源的访问定位</h2> 
  <p>可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。</p> 
  <p>一般的,每个资源至少有一个URI与之对应,最典型的URI即URL。</p> 
  <h1>十一在restful风格中,关于拦截器拦截URI却不能拦截jsp/html资源名称请求的安全问题的解决</h1> 
  <p>如果在 webapp下有静态资源,那么完全可以直接使用 <code>地址根路径+静态资名称去直接访问</code>,这不符合 restful风格uri对应静态文件的设计规范,同时也造成了系统的不安全性,例如:</p> 
  <h2><strong>1访问控制器映射的 uri(mvc/index),会被拦截器拦截,重定向到mvc/login:</strong></h2> 
  <p>参考上面我讲的拦截器的例子</p> 
  <p><img src="http://img.e-com-net.com/image/info8/07878a0c30844a7eadc7d53da195f984.jpg" alt="在这里插入图片描述" width="0" height="0"></p> 
  <h2><strong>2若是uri直接访问静态资源,springMVC的拦截器只会拦截controller上的映射请求,则不会拦截该请求,该访问会造成系统安全问题</strong></h2> 
  <p><a href="http://img.e-com-net.com/image/info8/1df23876c6e645cf80efe3df905e643f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/1df23876c6e645cf80efe3df905e643f.jpg" alt="在这里插入图片描述" width="513" height="95"></a></p> 
  <h2>3解决方案</h2> 
  <p>springmvc 拦截器,不拦截jsp文件<br> spring mvc的拦截器只拦截controller不拦截jsp文件,如果不拦截jsp文件也会给系统带安全性问题。</p> 
  <p>解决方案有:</p> 
  <h1><code>将所有的jsp文件放入到WEB-INF文件夹下,这样用户是直接不能访问WEB-INF文件下的jsp文件的。spring mvc的理念也是通过controller里的@RequestMapping来请求相关jsp页面,而非用户直接访问jsp页面。</code></h1> 
  <p><a href="http://img.e-com-net.com/image/info8/2bec654b0b7343ad8c796bda1df8f365.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/2bec654b0b7343ad8c796bda1df8f365.png" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第64张图片" width="284" height="241" style="border:1px solid black;"></a><br> 将静态文件转移到WEBINF下之后,注意修改 jsp页面静态文件的请求路径<br> ①如果 已经在springnvc配置文件中配置了<mvc:resources mapping="/js/**" location="/js/" > </mvc:resources> 静态资源映射,则jsp文件中的静态资源的请求不用 返回上一级路径,如果返回,则会访问不到静态资源!</p> 
  <p><a href="http://img.e-com-net.com/image/info8/71782621a90843b7bfbd2937adefd519.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/71782621a90843b7bfbd2937adefd519.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第65张图片" width="650" height="150" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/1e6a8def25a8440c95af1c7b48d71bc4.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/1e6a8def25a8440c95af1c7b48d71bc4.jpg" alt="在这里插入图片描述" width="650" height="92"></a><br> ②如果 没有配置<mvc:resources mapping="/js/**" location="/js/" > </mvc:resources>静态资源映射,<br> 则需要在jsp中返回上一层目录<br> <a href="http://img.e-com-net.com/image/info8/35ffc542ad0e42068e563f6a05a0b8fe.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/35ffc542ad0e42068e563f6a05a0b8fe.jpg" alt="【JAVA企业级开发】基于请求驱动的轻量型Web框架SpringMVC篇--------从基础到精通掌握SpringMVC框架_第66张图片" width="650" height="108" style="border:1px solid black;"></a></p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1283469957983649792"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(JAVA开发_搭建企业级网站)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1950232820773351424.htm"
                           title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a>
                        <span class="text-muted">good2know</span>

                        <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div>
                    </li>
                    <li><a href="/article/1950232316408295424.htm"
                           title="9、汇编语言编程入门:从环境搭建到简单程序实现" target="_blank">9、汇编语言编程入门:从环境搭建到简单程序实现</a>
                        <span class="text-muted">神经网络酱</span>
<a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/1.htm">汇编语言</a><a class="tag" taget="_blank" href="/search/MEPIS/1.htm">MEPIS</a><a class="tag" taget="_blank" href="/search/GNU%E5%B7%A5%E5%85%B7%E9%93%BE/1.htm">GNU工具链</a>
                        <div>汇编语言编程入门:从环境搭建到简单程序实现1.数据存储介质问题解决在处理数据存储时,若要使用MEPIS系统,需确保有其可访问的存储介质。目前,MEPIS无法向采用NTFS格式(常用于Windows2000和XP工作站)的硬盘写入数据。不过,若硬盘采用FAT32格式,MEPIS就能进行写入操作。此外,MEPIS还能将文件写入软盘和大多数USB闪存驱动器。若工作站连接到局域网,还可通过FTP协议或挂载</div>
                    </li>
                    <li><a href="/article/1950226391064702976.htm"
                           title="Flowable 实战落地核心:选型决策与坑点破解" target="_blank">Flowable 实战落地核心:选型决策与坑点破解</a>
                        <span class="text-muted">练习时长两年半的程序员小胡</span>
<a class="tag" taget="_blank" href="/search/Flowable/1.htm">Flowable</a><a class="tag" taget="_blank" href="/search/%E6%B5%81%E7%A8%8B%E5%BC%95%E6%93%8E%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/1.htm">流程引擎实战指南</a><a class="tag" taget="_blank" href="/search/%E4%BD%8E%E4%BB%A3%E7%A0%81/1.htm">低代码</a><a class="tag" taget="_blank" href="/search/BPMN/1.htm">BPMN</a><a class="tag" taget="_blank" href="/search/%E6%B5%81%E7%A8%8B%E5%BC%95%E6%93%8E/1.htm">流程引擎</a><a class="tag" taget="_blank" href="/search/flowable/1.htm">flowable</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>在企业级流程引擎的落地过程中,选型的准确性和坑点的预见性直接决定项目成败。本文聚焦Flowable实战中最关键的“选型决策”与“常见坑点”,结合真实项目经验,提供可落地的解决方案。一、流程引擎选型:从业务本质出发1.1选型的三大核心维度企业在选择流程引擎时,需避免陷入“技术崇拜”,应回归业务本质。评估Flowable是否适用,可从三个维度判断:业务复杂度若流程涉及动态审批链(如按金额自动升级审批)</div>
                    </li>
                    <li><a href="/article/1950226390070652928.htm"
                           title="Flowable 高级扩展:自定义元素与性能优化实战" target="_blank">Flowable 高级扩展:自定义元素与性能优化实战</a>
                        <span class="text-muted">练习时长两年半的程序员小胡</span>
<a class="tag" taget="_blank" href="/search/Flowable/1.htm">Flowable</a><a class="tag" taget="_blank" href="/search/%E6%B5%81%E7%A8%8B%E5%BC%95%E6%93%8E%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/1.htm">流程引擎实战指南</a><a class="tag" taget="_blank" href="/search/%E6%B5%81%E7%A8%8B%E5%9B%BE/1.htm">流程图</a><a class="tag" taget="_blank" href="/search/flowable/1.htm">flowable</a><a class="tag" taget="_blank" href="/search/BPMN/1.htm">BPMN</a><a class="tag" taget="_blank" href="/search/%E6%B5%81%E7%A8%8B%E5%BC%95%E6%93%8E/1.htm">流程引擎</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>在前五篇文章中,我们从基础概念、流程设计、API实战、SpringBoot集成,到外部系统协同,逐步构建了Flowable的应用体系。但企业级复杂场景中,原生功能往往难以满足定制化需求——比如需要特殊的审批规则网关、与决策引擎联动实现动态路由,或是在高并发场景下优化流程引擎性能。本文将聚焦Flowable的高级扩展能力,详解如何自定义流程元素、集成规则引擎,并掌握大型系统中的性能调优策略。一、自定</div>
                    </li>
                    <li><a href="/article/1950225255079407616.htm"
                           title="企业级区块链平台Hyperchain核心原理剖析" target="_blank">企业级区块链平台Hyperchain核心原理剖析</a>
                        <span class="text-muted">boyedu</span>
<a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%8C%BA%E5%9D%97%E9%93%BE%E5%B9%B3%E5%8F%B0/1.htm">企业级区块链平台</a><a class="tag" taget="_blank" href="/search/Hyperchain/1.htm">Hyperchain</a>
                        <div>Hyperchain作为国产自主可控的企业级联盟区块链平台,其核心原理围绕高性能共识、隐私保护、智能合约引擎及可扩展架构展开,通过多模块协同实现企业级区块链网络的高效部署与安全运行。以下从核心架构、关键技术、性能优化、安全机制、应用场景五个维度展开剖析:一、核心架构:分层解耦与模块化设计Hyperchain采用分层架构,将区块链功能解耦为独立模块,支持灵活组合与扩展:P2P网络层由验证节点(VP)</div>
                    </li>
                    <li><a href="/article/1950224745093984256.htm"
                           title="在线人数统计业务设计(场景八股文)" target="_blank">在线人数统计业务设计(场景八股文)</a>
                        <span class="text-muted"></span>

                        <div>业务问题在当经的网站中,在线人数的实时统计已经是一个必不可少的模块了,并且该统计功能最好能够按不同的时间间隔做的统计,现在需要你设计一个在线人数统计的模块,你应该怎么进行设计的呢?背景一个网校下会有多个学员。目前平台大概有十个,平台对应的网校大概五十几个,平均一个网校会有5w个用户,预计总人数为200w,最该学员的在线人数在10w左右。设计思路最开始的时候,想到的就是使用mysql直接实现,但是明</div>
                    </li>
                    <li><a href="/article/1950222978759323648.htm"
                           title="免费排版助手:智能修正段落 + 删除干扰符,杂乱文本一键变规范" target="_blank">免费排版助手:智能修正段落 + 删除干扰符,杂乱文本一键变规范</a>
                        <span class="text-muted"></span>

                        <div>各位文字工作者们!你们有没有被排版折磨到崩溃的时候?我跟你们说,我之前排版一篇文章,那简直就像在走迷宫,头晕眼花的!不过后来我发现了一款软件——排版助手!软件下载地址安装包这玩意儿是个文章智能排版工具,专门给新闻编辑、文摘网站这些文字工作者用的。它功能老多了,能修正段落,把那些乱七八糟的段落变得规规矩矩;还能删除干扰符,就像给文章做了个大扫除,把没用的东西都清理掉;简繁转换也不在话下,不管是简体还</div>
                    </li>
                    <li><a href="/article/1950213145742077952.htm"
                           title="02-Breakout靶机攻略" target="_blank">02-Breakout靶机攻略</a>
                        <span class="text-muted">ZLlllllll0</span>
<a class="tag" taget="_blank" href="/search/02-Breakout%E9%9D%B6%E6%9C%BA/1.htm">02-Breakout靶机</a>
                        <div>第一步搭建靶机下载地址:https://download.vulnhub.com/empire/02-Breakout.zip下载好了之后直接用VM打开然后右击虚拟机,把网络连接改成nat模式第二步,信息收集然后开启虚拟机,左上角编辑,虚拟网络编辑器里面看一下靶机是哪个网段。打开kali用nmap扫一下的这个网段的存活主机,也就是扫除这个靶机的具体ip地址nmap192.168.109.1/24扫</div>
                    </li>
                    <li><a href="/article/1950209236877242368.htm"
                           title="严重的DDoS 攻击澳大利亚主要宽带提供商" target="_blank">严重的DDoS 攻击澳大利亚主要宽带提供商</a>
                        <span class="text-muted">Fancy1816575412</span>

                        <div>本周早些时候,澳大利亚最大的固定无线宽带运营商CirrusCommunications遭受了一次重大的DDoS攻击,导致其一半以上的网络瘫痪。该公司在其网站上声称:“强大的架构、数百个传输站点以及光纤和微波回程的使用使其能够以非常高的正常运行时间提供高速”。CirrusCommunications表示,它覆盖了澳大利亚十大人口中心以及几个主要的区域中心,主要为企业和政府客户提供服务。然而,据The</div>
                    </li>
                    <li><a href="/article/1950204954295726080.htm"
                           title="Anaconda 和 Miniconda:功能详解与选择建议" target="_blank">Anaconda 和 Miniconda:功能详解与选择建议</a>
                        <span class="text-muted">古月฿</span>
<a class="tag" taget="_blank" href="/search/python%E5%85%A5%E9%97%A8/1.htm">python入门</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/conda/1.htm">conda</a>
                        <div>Anaconda和Miniconda详细介绍一、Anaconda的详细介绍1.什么是Anaconda?Anaconda是一个开源的包管理和环境管理工具,在数据科学、机器学习以及科学计算领域发挥着关键作用。它以Python和R语言为基础,为用户精心准备了大量预装库和工具,极大地缩短了搭建数据科学环境的时间。对于那些想要快速开展数据分析、模型训练等工作的人员来说,Anaconda就像是一个一站式的“数</div>
                    </li>
                    <li><a href="/article/1950204701714739200.htm"
                           title="环境搭建 | Python + Anaconda / Miniconda + PyCharm 的安装、配置与使用" target="_blank">环境搭建 | Python + Anaconda / Miniconda + PyCharm 的安装、配置与使用</a>
                        <span class="text-muted"></span>

                        <div>本文将分别介绍Python、Anaconda/Miniconda、PyCharm的安装、配置与使用,详细介绍Python环境搭建的全过程,涵盖Python、Pip、PythonLauncher、Anaconda、Miniconda、Pycharm等内容,以官方文档为参照,使用经验为补充,内容全面而详实。由于图片太多,就先贴一个无图简化版吧,详情请查看Python+Anaconda/Minicond</div>
                    </li>
                    <li><a href="/article/1950201675771867136.htm"
                           title="分布式链路追踪系统架构设计:从理论到企业级实践" target="_blank">分布式链路追踪系统架构设计:从理论到企业级实践</a>
                        <span class="text-muted">ma451152002</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a>
                        <div>分布式链路追踪系统架构设计:从理论到企业级实践本文深入探讨分布式链路追踪系统的架构设计原理、关键技术实现和企业级应用实践,为P7架构师提供完整的技术方案参考。目录引言:分布式链路追踪的重要性核心概念与技术原理系统架构设计数据模型与协议标准核心组件架构设计性能优化与扩展性设计企业级实施策略技术选型与对比分析监控与运维体系未来发展趋势P7架构师面试要点引言:分布式链路追踪的重要性微服务架构下的挑战在现</div>
                    </li>
                    <li><a href="/article/1950194868303228928.htm"
                           title="免费编程课程大汇总:从入门到精通的一站式资源" target="_blank">免费编程课程大汇总:从入门到精通的一站式资源</a>
                        <span class="text-muted">大力出奇迹985</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                        <div>在数字化时代,编程已成为一项至关重要的技能,无论是为了职业发展还是个人兴趣,学习编程都极具价值。本文精心汇总了丰富的免费编程课程资源,涵盖从基础入门到精通的各个阶段。通过全面介绍如Coursera、edX等在线学习平台,Codecademy、freeCodeCamp等交互式学习网站,以及B站、网易云课堂等视频课程平台的免费课程,为编程学习者提供了一站式的资源指南,帮助读者轻松开启编程学习之旅,逐步</div>
                    </li>
                    <li><a href="/article/1950194363237724160.htm"
                           title="用 Python 开发小游戏:零基础也能做出《贪吃蛇》" target="_blank">用 Python 开发小游戏:零基础也能做出《贪吃蛇》</a>
                        <span class="text-muted"></span>

                        <div>本文专为零基础学习者打造,详细介绍如何用Python开发经典小游戏《贪吃蛇》。无需复杂编程知识,从环境搭建到代码编写、功能实现,逐步讲解核心逻辑与操作。涵盖Pygame库的基础运用、游戏界面设计、蛇的移动与食物生成规则等,让新手能按步骤完成开发,同时融入SEO优化要点,帮助读者轻松入门Python游戏开发,体验从0到1做出游戏的乐趣。一、为什么选择用Python开发《贪吃蛇》对于零基础学习者来说,</div>
                    </li>
                    <li><a href="/article/1950191460854853632.htm"
                           title="你的连接不是专用连接攻击者可能试图从 github.com 窃取你的信息(例如,密码、消息或信用卡)。 --解决办法" target="_blank">你的连接不是专用连接攻击者可能试图从 github.com 窃取你的信息(例如,密码、消息或信用卡)。 --解决办法</a>
                        <span class="text-muted"></span>

                        <div>我遇到了.检查安全软件或企业防火墙/代理(包括VPN)这个问题,关了就好,我是用来xbox加速github,所以先开在关既可以加速又可以访问这个错误表明你的浏览器(MicrosoftEdge)无法安全地连接到GitHub,因为遇到了证书验证问题(NET::ERR_CERT_AUTHORITY_INVALID)。错误信息明确指出网站使用了HSTS(HTTPStrictTransportSecurit</div>
                    </li>
                    <li><a href="/article/1950187223672483840.htm"
                           title="GDP经济社会人文民生栅格数据下载网站汇总" target="_blank">GDP经济社会人文民生栅格数据下载网站汇总</a>
                        <span class="text-muted">疯狂学习GIS</span>

                        <div>  本文为“GIS数据获取整理”专栏(https://blog.csdn.net/zhebushibiaoshifu/category_10857546.html)中第八篇独立博客,因此本文全部标题均由“8”开头。本文对目前主要的GDP、社会与经济数据获取网站加以整理与介绍,若需其它GIS领域数据(如遥感影像数据、气象数据、土地土壤数据、农业数据等),大家可以点击上方专栏查看,也可以看这一篇汇总文</div>
                    </li>
                    <li><a href="/article/1950185537319006208.htm"
                           title="新手如何通过github pages静态网站托管搭建个人网站和项目站点" target="_blank">新手如何通过github pages静态网站托管搭建个人网站和项目站点</a>
                        <span class="text-muted">vvandre</span>
<a class="tag" taget="_blank" href="/search/Web%E6%8A%80%E6%9C%AF/1.htm">Web技术</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a>
                        <div>一、githubpages静态网站托管介绍githubpages它是一个免费快捷的静态网站托管服务。对比传统建站,它有哪些优点呢?在传统方式中,首先要租用服务器,服务器上需要运行外部程序,还需要再购买域名,要配置SSL证书,最后还要配置DNS,将域名解析到服务器。这一套繁琐操作,基本上就把小白劝退了。graphTDA[租用服务器]-->B[部署Web应用(运行外部程序,如Nginx)]B-->C[</div>
                    </li>
                    <li><a href="/article/1950185315146723328.htm"
                           title="《数字时代的学与教》第三模块共读心得" target="_blank">《数字时代的学与教》第三模块共读心得</a>
                        <span class="text-muted">恭昌</span>

                        <div>第三模块的主题是教法学法,主要用十一讲来阐述,分别是:同侪教学法、创造学习的新状态、讨论对话还是合作、解锁“拼图法”、把握合作学习五要素、TBL团队合作学习法、游戏式小组合作学习法、差异化教学法、从学科课堂开始的“创客教育”、探究式学习法及搭建“教学脚手架”。难度适中,同伴互助,学到知识,成就感强。教师要创造学生学习的新状态,让学生养成矫正性学习的新状态,即认识错误到自我改正错误,形成新的正确认识</div>
                    </li>
                    <li><a href="/article/1950184529079627776.htm"
                           title="二级域名分发系统商业版全开源v3版" target="_blank">二级域名分发系统商业版全开源v3版</a>
                        <span class="text-muted">CloseAi论坛</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81/1.htm">程序源码</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BA%A7%E5%9F%9F%E5%90%8D%E5%88%86%E5%8F%91%E7%B3%BB%E7%BB%9F%E5%95%86%E4%B8%9A%E7%89%88/1.htm">二级域名分发系统商业版</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a>
                        <div>介绍:名分发-快乐二级域名分发源码主要是二级域名分发网站源码,域名接口配置自己研究吧网盘下载地址:https://zijiewangpan.com/NbX6950sYLn图片:</div>
                    </li>
                    <li><a href="/article/1950183520588591104.htm"
                           title="搭建云手机教程" target="_blank">搭建云手机教程</a>
                        <span class="text-muted">云博客-资源宝</span>
<a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E6%89%8B%E6%9C%BA/1.htm">智能手机</a>
                        <div>搭建云手机教程本教程由分享:ziyouhua资源宝整理分享:www.httple.net首先检查自己vps是否支持这个项目sudoaptinstallcpu-checkerkvm-ok如果显示INFO:/dev/kvmexistsKVMaccelerationcanbeused表示支持,可以继续往下看ac13首先安装dockercurl-fsSLhttps://get.docker.com|sud</div>
                    </li>
                    <li><a href="/article/1950179707756539904.htm"
                           title="收评:两市震荡沪指涨0.57%创业板指涨1.42% 光伏风能板块大涨" target="_blank">收评:两市震荡沪指涨0.57%创业板指涨1.42% 光伏风能板块大涨</a>
                        <span class="text-muted">甚念_3264</span>

                        <div>金融界网站9月14日讯早盘三大股指高开,盘初市场震荡上行,创业板指一度涨超2%,随后指数呈现震荡整理态势,临近午盘小幅回落;午后A股延续低迷表现,深成指两度翻绿,尾盘两市小幅上扬。截至收盘,沪指涨0.57%,报3278.81点,深成指涨0.61%,报13021.99点,创业板指涨1.42%,报2572.6点。两市成交额约7700亿元;北向资金净流入近20亿元。行业板块方面,环保工程、材料行业、仪器</div>
                    </li>
                    <li><a href="/article/1950179235549212672.htm"
                           title="二级域名分发网站源码 商业版全开源" target="_blank">二级域名分发网站源码 商业版全开源</a>
                        <span class="text-muted">lskelasi</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81/1.htm">程序源码</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BA%A7%E5%9F%9F%E5%90%8D%E5%88%86%E5%8F%91%E6%BA%90%E7%A0%81/1.htm">二级域名分发源码</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BA%A7%E5%9F%9F%E5%90%8D%E5%88%86%E5%8F%91%E7%BD%91%E7%AB%99%E6%BA%90%E7%A0%81/1.htm">二级域名分发网站源码</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a>
                        <div>介绍:快乐二级域名分发-快乐二级域名分发源码主要是二级域名分发网站源码,不懂的不要下载了。本套源码可设置收费使用,有充值接口,域名接口配置自己研究吧网盘下载地址:https://zijiewangpan.com/jsX0JAuRE01图片:</div>
                    </li>
                    <li><a href="/article/1950179236295798784.htm"
                           title="word转pdf、pdf转word在线工具分享" target="_blank">word转pdf、pdf转word在线工具分享</a>
                        <span class="text-muted">bpmh</span>
<a class="tag" taget="_blank" href="/search/%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/1.htm">常用工具</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a>
                        <div>️一、在线转换网站(方便快捷,无需安装)MicrosoftOfficeOnline(官方推荐,最安全可靠):网址:直接使用你的Microsoft账户登录https://www.office.com/方法:将你的.docx或.doc文件上传到OneDrive。在OfficeOnline中打开该Word文档。点击文件>另存为>下载PDF副本。优点:官方出品,完全免费,无需额外上传到第三方服务器,安全性</div>
                    </li>
                    <li><a href="/article/1950178478850633728.htm"
                           title="最新二级域名分发系统网站源码 可商用" target="_blank">最新二级域名分发系统网站源码 可商用</a>
                        <span class="text-muted">huihuixxx</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81/1.htm">程序源码</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E9%AC%BC%E6%8E%88%E6%9D%83%E7%B3%BB%E7%BB%9F/1.htm">小鬼授权系统</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E5%85%A8%E8%A7%A3%E5%AF%86%E6%BA%90%E7%A0%81/1.htm">源码全解密源码</a><a class="tag" taget="_blank" href="/search/%E6%8E%88%E6%9D%83%E4%BB%A3%E7%A0%81/1.htm">授权代码</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BA%A7%E5%9F%9F%E5%90%8D%E5%88%86%E5%8F%91%E7%B3%BB%E7%BB%9F/1.htm">二级域名分发系统</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%AB%99%E6%BA%90%E7%A0%81/1.htm">网站源码</a>
                        <div>介绍:1.源码楼主网上买的没有后门是旧版本2.支付接口调用的是码支付来进行的3.支付接口需要登陆管理员后台安装4.支付接口必须信息正确只能装一次5.在线充值默认的充值比例是1:1【搭建教程】1.把源码上传主机并解压2.绑定根目录和域名并解析3.访问你的域名即可提示安装4.后台登陆地址:你的域名/admin5.登陆后台安装你的支付接口(需要的话)6.码支付怎么使用方法百度一下!网盘下载地址:http</div>
                    </li>
                    <li><a href="/article/1950175761738559488.htm"
                           title="不想去上班,在家就能做十大工作" target="_blank">不想去上班,在家就能做十大工作</a>
                        <span class="text-muted">配音就业圈</span>

                        <div>如果不想上班,居家以下十个工作可供参考。1.在线调查:加入各种在线调查平台,回答问卷并获得奖励。一般是几元,到几十元不等。兼职副业推荐公众号,配音新手圈,声优配音圈,新配音兼职圈,配音就业圈,鼎音副业,有声新手圈,每天更新各种远程工作与在线兼职,职位包括:写手、程序开发、剪辑、设计、翻译、配音、无门槛、插画、翻译、等等。。。每日更新兼职。2.网上写作:如果你擅长写作,可以选择成为自由撰稿人,为网站</div>
                    </li>
                    <li><a href="/article/1950175452580605952.htm"
                           title="Gerapy爬虫管理框架深度解析:企业级分布式爬虫管控平台" target="_blank">Gerapy爬虫管理框架深度解析:企业级分布式爬虫管控平台</a>
                        <span class="text-muted">Python×CATIA工业智造</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a>
                        <div>引言:爬虫工程化的必然选择随着企业数据采集需求指数级增长,传统单点爬虫管理模式面临三重困境:管理效率瓶颈:手动部署耗时占开发总时长的40%以上系统可靠性低:研究显示超过65%的爬虫故障源于部署或调度错误资源利用率差:平均爬虫服务器CPU利用率不足30%爬虫管理方案对比:┌───────────────┬─────────────┬───────────┬───────────┬──────────</div>
                    </li>
                    <li><a href="/article/1950169524384886784.htm"
                           title="【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)" target="_blank">【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)</a>
                        <span class="text-muted">笙囧同学</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a>
                        <div>核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认</div>
                    </li>
                    <li><a href="/article/1950165742594879488.htm"
                           title="在Ubuntu24.04搭建VLLM, SGLang 和 LangChain环境" target="_blank">在Ubuntu24.04搭建VLLM, SGLang 和 LangChain环境</a>
                        <span class="text-muted">小熊冲!冲!冲!</span>
<a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a><a class="tag" taget="_blank" href="/search/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/1.htm">毕业设计</a>
                        <div>在Ubuntu24.04搭建VLLM,SGLang和LangChain环境[!NOTE]概述整片文章是笔者的回忆(白天忙碌了一天,晚上进行的总结),所以有些地方的描述可能有误差,本文更多的是大体方向问题,细节步骤不是本文的重点,见谅!!!如何安装Ubuntu24.04制作启动U盘,作者使用的是rufus.exe工具下载Ubuntu24.04的ISO镜像使用rufus.exe工具刷入Ubuntu22</div>
                    </li>
                    <li><a href="/article/1950148599039979520.htm"
                           title="Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战" target="_blank">Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战</a>
                        <span class="text-muted">大葱白菜</span>
<a class="tag" taget="_blank" href="/search/java%E5%90%88%E9%9B%86/1.htm">java合集</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91/1.htm">个人开发</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/1.htm">代理模式</a>
                        <div>作为一名Java开发工程师,你一定在使用Spring、MyBatis、RPC框架等技术时接触过“代理”(Proxy)这个概念。无论是Spring的AOP(面向切面编程)、事务管理,还是远程调用、日志记录、权限控制等场景,代理机制都扮演着至关重要的角色。本文将带你全面掌握:什么是代理?静态代理与动态代理的区别JDK动态代理与CGLIB动态代理的实现原理代理模式的典型应用场景代理在主流框架中的使用(如</div>
                    </li>
                    <li><a href="/article/1950145701786742784.htm"
                           title="java web开发实战经典 当当_java web项目实战开发" target="_blank">java web开发实战经典 当当_java web项目实战开发</a>
                        <span class="text-muted">飞翔的酋长大人</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E7%BB%8F%E5%85%B8/1.htm">web开发实战经典</a><a class="tag" taget="_blank" href="/search/%E5%BD%93%E5%BD%93/1.htm">当当</a>
                        <div>本书以问题为导向,涵盖JavaWeb开发技术中所有的核心知识点;实战开发案例丰富,所有的知识案例都来源于企业真实项目,实战性和可操作性强;代码注释详细准确,结构简洁清晰;语言简明易懂,由浅入深地带你学会JavaWeb技术及应用。本书面向广大Java开发工程师和普通高校学生,可作为高等学校计算机及其相关专业Web编程技术课程教材,也可供从事JavaWeb应用开发的技术人员学习参考。¥80.00定价:</div>
                    </li>
                                <li><a href="/article/5.htm"
                                       title="[星球大战]阿纳金的背叛" target="_blank">[星球大战]阿纳金的背叛</a>
                                    <span class="text-muted">comsci</span>

                                    <div> 
      本来杰迪圣殿的长老是不同意让阿纳金接受训练的......... 
 
    但是由于政治原因,长老会妥协了...这给邪恶的力量带来了机会 
 
    所以......现代的地球联邦接受了这个教训...绝对不让某些年轻人进入学院 
 
   </div>
                                </li>
                                <li><a href="/article/132.htm"
                                       title="看懂它,你就可以任性的玩耍了!" target="_blank">看懂它,你就可以任性的玩耍了!</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>          javascript作为前端开发的标配技能,如果不掌握好它的三大特点:1.原型 2.作用域 3. 闭包 ,又怎么可以说你学好了这门语言呢?如果标配的技能都没有撑握好,怎么可以任性的玩耍呢?怎么验证自己学好了以上三个基本点呢,我找到一段不错的代码,稍加改动,如果能够读懂它,那么你就可以任性了。 
function jClass(b</div>
                                </li>
                                <li><a href="/article/259.htm"
                                       title="Java常用工具包 Jodd" target="_blank">Java常用工具包 Jodd</a>
                                    <span class="text-muted">Kai_Ge</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jodd/1.htm">jodd</a>
                                    <div>Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架。简单,却很强大!  写道   Jodd = Tools + IoC + MVC + DB + AOP + TX + JSON + HTML < 1.5 Mb  
Jodd 被分成众多模块,按需选择,其中 
 
  工具类模块有:  
  
   jodd-core    &nb</div>
                                </li>
                                <li><a href="/article/386.htm"
                                       title="SpringMvc下载" target="_blank">SpringMvc下载</a>
                                    <span class="text-muted">120153216</span>
<a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a>
                                    <div>@RequestMapping(value = WebUrlConstant.DOWNLOAD)
	public void download(HttpServletRequest request,HttpServletResponse response,String fileName) {
		OutputStream os = null;
		InputStream is = null;
</div>
                                </li>
                                <li><a href="/article/513.htm"
                                       title="Python 标准异常总结" target="_blank">Python 标准异常总结</a>
                                    <span class="text-muted">2002wmj</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                                    <div>Python标准异常总结  
    AssertionError 断言语句(assert)失败   AttributeError 尝试访问未知的对象属性   EOFError 用户输入文件末尾标志EOF(Ctrl+d)   FloatingPointError 浮点计算错误   GeneratorExit generator.close()方法被调用的时候   ImportError 导入模块失</div>
                                </li>
                                <li><a href="/article/640.htm"
                                       title="SQL函数返回临时表结构的数据用于查询" target="_blank">SQL函数返回临时表结构的数据用于查询</a>
                                    <span class="text-muted">357029540</span>
<a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a>
                                    <div>这两天在做一个查询的SQL,这个SQL的一个条件是通过游标实现另外两张表查询出一个多条数据,这些数据都是INT类型,然后用IN条件进行查询,并且查询这两张表需要通过外部传入参数才能查询出所需数据,于是想到了用SQL函数返回值,并且也这样做了,由于是返回多条数据,所以把查询出来的INT类型值都拼接为了字符串,这时就遇到问题了,在查询SQL中因为条件是INT值,SQL函数的CAST和CONVERST都</div>
                                </li>
                                <li><a href="/article/767.htm"
                                       title="java 时间格式化 | 比较大小| 时区 个人笔记" target="_blank">java 时间格式化 | 比较大小| 时区 个人笔记</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/MyEclipse/1.htm">MyEclipse</a>
                                    <div>个人总结! 不当之处多多包含! 
 
  引用   1.0 如何设置 tomcat 的时区: 
         位置:(catalina.bat---JAVA_OPTS  下面加上) 
         set JAVA_OPT</div>
                                </li>
                                <li><a href="/article/894.htm"
                                       title="时间获取Clander的用法" target="_blank">时间获取Clander的用法</a>
                                    <span class="text-muted">adminjun</span>
<a class="tag" taget="_blank" href="/search/Clander/1.htm">Clander</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4/1.htm">时间</a>
                                    <div>/** 
   * 得到几天前的时间 
   * @param d 
   * @param day 
   * @return 
   */ 
  public static Date getDateBefore(Date d,int day){ 
   Calend</div>
                                </li>
                                <li><a href="/article/1021.htm"
                                       title="JVM初探与设置" target="_blank">JVM初探与设置</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台</div>
                                </li>
                                <li><a href="/article/1148.htm"
                                       title="SQL中ON和WHERE的区别" target="_blank">SQL中ON和WHERE的区别</a>
                                    <span class="text-muted">avords</span>

                                    <div>SQL中ON和WHERE的区别       
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。   www.2cto.com     在使用left jion时,on和where条件的区别如下:    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。  </div>
                                </li>
                                <li><a href="/article/1275.htm"
                                       title="说说自信" target="_blank">说说自信</a>
                                    <span class="text-muted">houxinyou</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a>
                                    <div>自信的来源分为两种,一种是源于实力,一种源于头脑.实力是一个综合的评定,有自身的能力,能利用的资源等.比如我想去月亮上,要身体素质过硬,还要有飞船等等一系列的东西.这些都属于实力的一部分.而头脑不同,只要你头脑够简单就可以了!同样要上月亮上,你想,我一跳,1米,我多跳几下,跳个几年,应该就到了!什么?你说我会往下掉?你笨呀你!找个东西踩一下不就行了吗? 
  
  
无论工作还</div>
                                </li>
                                <li><a href="/article/1402.htm"
                                       title="WEBLOGIC事务超时设置" target="_blank">WEBLOGIC事务超时设置</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/weblogic/1.htm">weblogic</a><a class="tag" taget="_blank" href="/search/jta/1.htm">jta</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1%E8%B6%85%E6%97%B6/1.htm">事务超时</a>
                                    <div>        系统中统计数据,由于调用统计过程,执行时间超过了weblogic设置的时间,提示如下错误: 
统计数据出错!
原因:The transaction is no longer active - status: 'Rolling Back. [Reason=weblogic.transaction.internal</div>
                                </li>
                                <li><a href="/article/1529.htm"
                                       title="两年已过去,再看该如何快速融入新团队" target="_blank">两年已过去,再看该如何快速融入新团队</a>
                                    <span class="text-muted">bingyingao</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a><a class="tag" taget="_blank" href="/search/%E8%9E%8D%E5%85%A5/1.htm">融入</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E5%9B%A2%E9%98%9F/1.htm">新团队</a>
                                    <div>偶得的空闲,翻到了两年前的帖子 
该如何快速融入一个新团队,有所感触,就记下来,为下一个两年后的今天做参考。 
 
    时隔两年半之后的今天,再来看当初的这个博客,别有一番滋味。而我已经于今年三月份离开了当初所在的团队,加入另外的一个项目组,2011年的这篇博客之后的时光,我很好的融入了那个团队,而直到现在和同事们关系都特别好。大家在短短一年半的时间离一起经历了一</div>
                                </li>
                                <li><a href="/article/1656.htm"
                                       title="【Spark七十七】Spark分析Nginx和Apache的access.log" target="_blank">【Spark七十七】Spark分析Nginx和Apache的access.log</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a>
                                    <div>Spark分析Nginx和Apache的access.log,第一个问题是要对Nginx和Apache的access.log文件进行按行解析,按行解析就的方法是正则表达式: 
  
Nginx的access.log解析正则表达式 
  
val PATTERN = """([^ ]*) ([^ ]*) ([^ ]*) (\\[.*\\]) (\&q</div>
                                </li>
                                <li><a href="/article/1783.htm"
                                       title="Erlang patch" target="_blank">Erlang patch</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a>
                                    <div>Totally five patchs committed to erlang otp, just small patchs. 
IMO, erlang really is a interesting programming language, I really like its concurrency feature. 
but the functional programming style </div>
                                </li>
                                <li><a href="/article/1910.htm"
                                       title="log4j日志路径中加入日期" target="_blank">log4j日志路径中加入日期</a>
                                    <span class="text-muted">bro_feng</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a>
                                    <div>要用log4j使用记录日志,日志路径有每日的日期,文件大小5M新增文件。 
实现方式 
log4j: 
<appender name="serviceLog"
		class="org.apache.log4j.RollingFileAppender">
      	<param name="Encoding" v</div>
                                </li>
                                <li><a href="/article/2037.htm"
                                       title="读《研磨设计模式》-代码笔记-桥接模式" target="_blank">读《研磨设计模式》-代码笔记-桥接模式</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 



/**
 * 个人觉得关于桥接模式的例子,蜡笔和毛笔这个例子是最贴切的:http://www.cnblogs.com/zhenyulu/articles/67016.html
 * 笔和颜色是可分离的,蜡笔把两者耦合在一起了:一支蜡笔只有一种</div>
                                </li>
                                <li><a href="/article/2164.htm"
                                       title="windows7下SVN和Eclipse插件安装" target="_blank">windows7下SVN和Eclipse插件安装</a>
                                    <span class="text-muted">chenyu19891124</span>
<a class="tag" taget="_blank" href="/search/eclipse%E6%8F%92%E4%BB%B6/1.htm">eclipse插件</a>
                                    <div>今天花了一天时间弄SVN和Eclipse插件的安装,今天弄好了。svn插件和Eclipse整合有两种方式,一种是直接下载插件包,二种是通过Eclipse在线更新。由于之前Eclipse版本和svn插件版本有差别,始终是没装上。最后在网上找到了适合的版本。所用的环境系统:windows7JDK:1.7svn插件包版本:1.8.16Eclipse:3.7.2工具下载地址:Eclipse下在地址:htt</div>
                                </li>
                                <li><a href="/article/2291.htm"
                                       title="[转帖]工作流引擎设计思路" target="_blank">[转帖]工作流引擎设计思路</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8/1.htm">企业应用</a>
                                    <div> 作为国内的同行,我非常希望在流程设计方面和大家交流,刚发现篇好文(那么好的文章,现在才发现,可惜),关于流程设计的一些原理,个人觉得本文站得高,看得远,比俺的文章有深度,转载如下 
 
================================================================================= 
 
自开博以来不断有朋友来探讨工作流引擎该如何</div>
                                </li>
                                <li><a href="/article/2418.htm"
                                       title="Linux 查看内存,CPU及硬盘大小的方法" target="_blank">Linux 查看内存,CPU及硬盘大小的方法</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/cpu/1.htm">cpu</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98/1.htm">内存</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E7%9B%98/1.htm">硬盘</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%B0%8F/1.htm">大小</a>
                                    <div>一、查看CPU信息的命令 
 
[root@R4 ~]# cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep "physical id" 
model name : Intel(R) Xeon(R) CPU X5450 @ 3.00GHz 
model name : </div>
                                </li>
                                <li><a href="/article/2545.htm"
                                       title="linux 踢出在线用户" target="_blank">linux 踢出在线用户</a>
                                    <span class="text-muted">dongwei_6688</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>两个步骤: 
1.用w命令找到要踢出的用户,比如下面: 
  
[root@localhost ~]# w
 18:16:55 up 39 days,  8:27,  3 users,  load average: 0.03, 0.03, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT</div>
                                </li>
                                <li><a href="/article/2672.htm"
                                       title="放手吧,就像不曾拥有过一样" target="_blank">放手吧,就像不曾拥有过一样</a>
                                    <span class="text-muted">dcj3sjt126com</span>

                                    <div>内容提要:   
静悠悠编著的《放手吧就像不曾拥有过一样》集结“全球华语世界最舒缓心灵”的精华故事,触碰生命最深层次的感动,献给全世界亿万读者。《放手吧就像不曾拥有过一样》的作者衷心地祝愿每一位读者都给自己一个重新出发的理由,将那些令你痛苦的、扛起的、背负的,一并都放下吧!把憔悴的面容换做一种清淡的微笑,把沉重的步伐调节成春天五线谱上的音符,让自己踏着轻快的节奏,在人生的海面上悠然漂荡,享受宁静与</div>
                                </li>
                                <li><a href="/article/2799.htm"
                                       title="php二进制安全的含义" target="_blank">php二进制安全的含义</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                    <div>PHP里,有string的概念。
string里,每个字符的大小为byte(与PHP相比,Java的每个字符为Character,是UTF8字符,C语言的每个字符可以在编译时选择)。
byte里,有ASCII代码的字符,例如ABC,123,abc,也有一些特殊字符,例如回车,退格之类的。
特殊字符很多是不能显示的。或者说,他们的显示方式没有标准,例如编码65到哪儿都是字母A,编码97到哪儿都是字符</div>
                                </li>
                                <li><a href="/article/2926.htm"
                                       title="Linux下禁用T440s,X240的一体化触摸板(touchpad)" target="_blank">Linux下禁用T440s,X240的一体化触摸板(touchpad)</a>
                                    <span class="text-muted">gashero</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ThinkPad/1.htm">ThinkPad</a><a class="tag" taget="_blank" href="/search/%E8%A7%A6%E6%91%B8%E6%9D%BF/1.htm">触摸板</a>
                                    <div>自打1月买了Thinkpad T440s就一直很火大,其中最让人恼火的莫过于触摸板。 
  
Thinkpad的经典就包括用了小红点(TrackPoint)。但是小红点只能定位,还是需要鼠标的左右键的。但是自打T440s等开始启用了一体化触摸板,不再有实体的按键了。问题是要是好用也行。 
  
实际使用中,触摸板一堆问题,比如定位有抖动,以及按键时会有飘逸。这就导致了单击经常就</div>
                                </li>
                                <li><a href="/article/3053.htm"
                                       title="graph_dfs" target="_blank">graph_dfs</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/Graph/1.htm">Graph</a>
                                    <div>package edu.xidian.graph;

class MyStack {
	private final int SIZE = 20;
	private int[] st;
	private int top;

	public MyStack() {
		st = new int[SIZE];
		top = -1;
	}

	public void push(i</div>
                                </li>
                                <li><a href="/article/3180.htm"
                                       title="Spring4.1新特性——Spring核心部分及其他" target="_blank">Spring4.1新特性——Spring核心部分及其他</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/spring+4.1/1.htm">spring 4.1</a>
                                    <div>目录 
Spring4.1新特性——综述 
Spring4.1新特性——Spring核心部分及其他 
Spring4.1新特性——Spring缓存框架增强 
Spring4.1新特性——异步调用和事件机制的异常处理 
Spring4.1新特性——数据库集成测试脚本初始化 
Spring4.1新特性——Spring MVC增强 
Spring4.1新特性——页面自动化测试框架Spring MVC T</div>
                                </li>
                                <li><a href="/article/3307.htm"
                                       title="配置HiveServer2的安全策略之自定义用户名密码验证" target="_blank">配置HiveServer2的安全策略之自定义用户名密码验证</a>
                                    <span class="text-muted">liyonghui160com</span>

                                    <div>  
  
具体从网上看 
  
http://doc.mapr.com/display/MapR/Using+HiveServer2#UsingHiveServer2-ConfiguringCustomAuthentication 
  
 
  
   
   LDAP Authentication using OpenLDAP 
   Setting </div>
                                </li>
                                <li><a href="/article/3434.htm"
                                       title="一位30多的程序员生涯经验总结" target="_blank">一位30多的程序员生涯经验总结</a>
                                    <span class="text-muted">pda158</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E5%92%A8%E8%AF%A2/1.htm">咨询</a>
                                    <div>1.客户在接触到产品之后,才会真正明白自己的需求。 
  这是我在我的第一份工作上面学来的。只有当我们给客户展示产品的时候,他们才会意识到哪些是必须的。给出一个功能性原型设计远远比一张长长的文字表格要好。 2.只要有充足的时间,所有安全防御系统都将失败。 
  安全防御现如今是全世界都在关注的大课题、大挑战。我们必须时时刻刻积极完善它,因为黑客只要有一次成功,就可以彻底打败你。   3.</div>
                                </li>
                                <li><a href="/article/3561.htm"
                                       title="分布式web服务架构的演变" target="_blank">分布式web服务架构的演变</a>
                                    <span class="text-muted">自由的奴隶</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a>
                                    <div>最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网站具备了一定的特色,吸引了部分人访问,逐渐你发现系统的压力越来越高,响应速度越来越慢,而这个时候比较明显的是数据库和应用互相影响,应用出问题了,数据库也很容易出现问题,而数据库出问题的时候,应用也容易</div>
                                </li>
                                <li><a href="/article/3688.htm"
                                       title="初探Druid连接池之二——慢SQL日志记录" target="_blank">初探Druid连接池之二——慢SQL日志记录</a>
                                    <span class="text-muted">xingsan_zhang</span>
<a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97/1.htm">日志</a><a class="tag" taget="_blank" href="/search/%E8%BF%9E%E6%8E%A5%E6%B1%A0/1.htm">连接池</a><a class="tag" taget="_blank" href="/search/druid/1.htm">druid</a><a class="tag" taget="_blank" href="/search/%E6%85%A2SQL/1.htm">慢SQL</a>
                                    <div>由于工作原因,这里先不说连接数据库部分的配置,后面会补上,直接进入慢SQL日志记录。 
  
1.applicationContext.xml中增加如下配置: 
<bean abstract="true" id="mysql_database" class="com.alibaba.druid.pool.DruidDataSourc</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>