- 导入spring-mvc依赖
<!-- Spring MVC--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency>
- 新建一个spring的xml文件,前缀有context和MVC
```xml
<?xml version=”1.0” encoding=”UTF-8”?>
3.
spring-mvc.xml中组件扫描web包
```xml
<!--组件扫描-->
<context:component-scan base-package="com.jie.ssm.web"/>
spring-mvc.xml配置视图解析器
<!-- 视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- viewClass,视图, 默认是 InternalResourceView JstlView是 InternalResourceView子视图,增加了对jstl标签库的支持 --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- 视图路径的前缀 --> <property name="prefix" value="/WEN-INF/views/"/> <!-- 视图路径的后缀 --> <property name="suffix" value=".jsp"/> <property name="contentType" value="text/html;charset=UTF-8"/> </bean>
- web.xml的3.1版本
```xml
6.
web.xml配置前端控制器(所有请求都要从控制器中走)
```xml
<!-- Spring MVC 前端控制器 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定配置文件路径 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!-- /:表示所有的请求都要经过前端控制器 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
容器之间的关系
web.xml配置ContextLoaderListener监听器 ```xml
contextConfigLocation classpath:beans.xml
9.
Login案例
1.
创建controller 包
2.
创建LoginController类
3.
pom.xml导入servlet和jstl标签依赖
```xml
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.web/jstl-impl -->
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
- 写LoginController ```java package com.jie.ssm.web.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;
@Controller//表示这个一个控制器 public class LoginController {
@RequestMapping(value = "/login",method = RequestMethod.GET)// /login访问该方法,该方法类型的是get请求
public String login(){
return "login";
}
}
-
完整写法
```java
package com.jie.ssm.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller//表示这个一个控制器
public class LoginController {
@RequestMapping(value = "/login",method = RequestMethod.GET)// /login访问该方法,该方法类型的是get请求
public ModelAndView login(){
ModelAndView mv = new ModelAndView();
mv.setViewName("login");
mv.addObject("test","hello");
return mv;
}
}
- 返回是字符串或者ModelAndView,最终都会是ModelAndView对象
返回数据
@RequestMapping(value = "/data",method = RequestMethod.GET) @ResponseBody public String data(){ return "!!!"; }
日志
- 导包
```xml
UTF-8 1.7 1.7 3.5.6 5.2.9.RELEASE 3.2.8 1.7.25 1.2.3
- 导包
```xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- logback-core基础包 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- logback-classic是slf4j具体实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- logback-access访问模块,用于与Servlet容器集成,提供通过http协议来访问日志的功能 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
2.
引入日志
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan,当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- debug,当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false -->
<configuration scan="true" scanPeriod="30 seconds" debug="false">
<!-- 自定义属性,可以通过${属性名}进行访问 -->
<property name="log.home" value="./" />
<property name="app.name" value="demo" />
<!-- 归档日志文件的最大数量 -->
<property name="maxHistory" value="7" />
<contextName>${app.name}</contextName>
<!-- 日志输出格式 -->
<property name="PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger{100} %msg %n" />
<!-- 输出源:控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!-- 输出源:文件输出(等级过滤只输出DEBUG日志) -->
<appender name="FILE_DEBUG"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志输出文件地址 -->
<file>${log.home}/logs/${app.name}_debug.log</file>
<!-- 追加到文件末尾 -->
<append>true</append>
<!-- 日志过滤设置,这里只输出DEBUG日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 日志归档策略:按天来滚动,如果需要按小时来滚动,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.home}/logs/${app.name}_debug.%d{yyyy-MM-dd}.log
</fileNamePattern>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,,例如设置为30的话,则30天之后,旧的日志就会被删除 -->
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<!-- 输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${PATTERN}</Pattern>
</encoder>
</appender>
<!-- 输出源:文件输出(等级过滤,只输出INFO日志) -->
<appender name="FILE_INFO"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.home}/logs/${app.name}_info.log</file>
<!-- 只输出INFO日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.home}/logs/${app.name}_info.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<!-- 输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${PATTERN}</Pattern>
</encoder>
</appender>
<!-- 输出源:文件输出(阈值过滤) -->
<appender name="FILE_WARN"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.home}/logs/${app.name}_warn.log</file>
<!-- 过滤WARN等级前的日志,即输出WARN等级之后的所有日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.home}/logs/${app.name}_warn.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<!-- 输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${PATTERN}</Pattern>
</encoder>
</appender>
<!-- 输出源:文件输出(等级过滤) -->
<appender name="FILE_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.home}/logs/${app.name}_error.log</file>
<!-- 只输出ERROR日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 按天滚动,如果需要按小时来滚动,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.home}/logs/${app.name}_error.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${PATTERN}</Pattern>
</encoder>
</appender>
<!-- DEBUG INFO WARN ERROR-->
<logger name="org.springframework" level="DEBUG" />
<logger name="org.apache.ibatis" level="DEBUG" />
<logger name="java.sql" level="DEBUG" />
<logger name="com.jingluu" level="DEBUG" />
<!-- 控制com.jingluu包(及子包)下的日志输出,level设置等级;addtivity等于false表示不再向父包进行传递 -->
<!--<logger name="com.jingluu" level="INFO" addtivity="false">
<appender-ref ref="FILE_DEBUG" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="FILE_ERROR" />
</logger>-->
<!-- 最顶级日志控制,ROOT只有一个 -->
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_DEBUG" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="FILE_ERROR" />
</root>
</configuration>
