参考牛客网高级项目教程
常见调试方法
- 根据响应状态码提示
- 可大致知道问题出现的大方向,从哪方面去调试处理
- 服务端断点调试技巧
- 客户端断点调试技巧
- 对前后端有怀疑的程序进行调试跟踪,分析变量、执行过程,进行排查
- 设置日志级别,并将日志输出到不同的终端
- 通过日志打印的信息,进行排查,特别是对mybaits的sql问题,很有效
1. 常见响应状态码
官网
200成功响应
Status Code:200
- 表示响应成功,很常见的一个状态
300状态码
301(转发跳转)
-
表示客户端跳转,永久性跳转,请求转发一般在servlet中使用如下代码
-
response.setStatus(301);
-
response.setHeader(“Location”,“fail.html”);
-
springMVC: return "/index"或return “forward:/index”
-
-
url的访问路径名不改变改变
// 转发/hello3路径网页的请求 servletContext.getRequestDispatcher("/hello3").forward(req, resp);
302(重定向):
-
价值,降低耦合,使功能相对独立,实现功能之间的跳转
-
客户端跳转,临时性的跳转
-
url访问地址会发生变化
例如
- 点击登录表单login.jsp静态页面:
- 表单提交后,会访问…/login路径的服务端servlet,
- sevlet处理完数据后,会将请求返回给客户端,让客户端重定向去访问index.jsp页面
- 这个是重要逻辑,登录页面与主页页面独立,
- sevlet或controller只负责处理验证信息,决定两个页面的跳转=
- 然后客户端访问index页面,得到响应结果
![](https://i-blog.csdnimg.cn/blog_migrate/4589fc28eb8d4b613351163b435e983a.png)
- 点击登录后,跳转到登录请求的url,登录请求url会重定向index页面
![](https://i-blog.csdnimg.cn/blog_migrate/d7391311f13b9e13c03c7537d77d04a8.png)
请求转发与重定向的区别
- 请求转发是A通过中间B获取C的信息
- 访问路径名url不会改变
- 重定向是三角关系,A请求B,B给了C的地址,让A去请求C
- 访问路径名url会改变
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/54a7d189d39d927b613faa9b7b9eaf4f.png)
- 重定向-A与B没有耦合,A中数据无法带给B
- 是两次请求,只是A建议浏览器访问B
- 转发-A与B有耦合,A中数据可以转发给B,返回给浏览器
- 只有一次请求,浏览器只认识A,不认识B
contreller返回模板视图名与返回路径名的区别
- 在SpringMVC中,controller封装完model,
- 如果返回逻辑视图文件名,
- return “/index”; 指的是渲染模板视图页面,自动拼接模板文件的相对路径加后缀名
- 访问的是这个资源文件的文件名地址,如html或jsp,将渲染结果返回给dispatchServlet,再展现给浏览器
- 当然,这些视图文件,通过url+文件名,本身也可以直接显示,不过单独显示的是静态网页
- 如果返回的是url路径名,
- return “redirect:/index”;重定向,是访问另一个…/index的url地址
- 会直接让浏览器访问这个url,会自动跳转到指定页面,并刷新显示
其他300状态码
- status:304
- 304 表示资源未被修改。当不是第一次访问一个静态页面或者图片的时候,就会得到这么一个提示。
- 这是服务端提示浏览器,这个资源没有发生改变,你直接使用上一次下载的就行了,不需要重新下载。 这样就节约了带宽,并且浏览器的加载速度也更快。
客户端响应
404 Not Found
- Status Code:404 表示访问的页面不存在,表示一个浏览器的错误,就是服务端没提供这个服务,但是你却去访问。
- 一般检查路径优先
- 即访问路径有没有写错
- 服务端的url映射有没有问题
服务端响应
500 Internal Server Error
- Status Code:500 表示服务端的错误,一般检查servlet。
其他相关
-
Status Code:100 表示继续
-
Status Code:401 表示未授权
-
Status Code:402 表示需要付费(很少见)
-
Status Code:403 表示禁止
-
Status Code:405 表示方法不被允许
-
Status Code:406 表示无法接受(很少见)
-
Status Code:408 表示请求超时
-
Status Code:413 表示实体过大(这个什么鬼)
-
Status Code:507 表示存储不足
2. 断点调试技巧
-
服务端用idea断点调试,客户端,用浏览器的检查调试功能
-
设置断点,进行跟踪查看,变量,过程
-
断点的管理
3. 设置日志
logback-spring.xml
- 在SpringBoot中,配置文件名logback-spring.xml,会自动被加载,如果不是这个名字,不行
设置日志文件的存储位置
-
将日志文件进行保存,以便于今后的查看检查
-
文件保存的位置设定,将日志根据不同级别,大小进行归类
<contextName>community</contextName> <property name="LOG_PATH" value="E:/javaWeb/data"/> <property name="APPDIR" value="community2"/>
不同日志级别的设定
-
以error日志级别为例:主要包含以下信息
- 日志文件名
- 日志滚动策略:
- 每个文件最大大小
- 最多保存时间
- 是否追加形式存储
- 日志的格式
- 过滤的级别
<!-- error file --> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APPDIR}/log_error.log</file> <!-- 滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 以追加形式存储,不是覆盖--> <append>true</append> <!-- 日志的格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 过滤器--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
控制台输出设定
- 设置控制台输出的级别,输出在设置级别以上的日志
<!-- console -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
指定文件日志级别设定
- 默认的日志级别:
- 嵌套其他级别的设定
<!-- 指定路径下的文件设定为debug日志级别-->
<logger name="com.nowcoder.community" level="debug"/>
<!--根目录下所有jar包下的文件的日志级别设定,默认info-->
<root level="info">
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="STDOUT"/>
</root>
使用测试:
- 使用工厂默认创建日志对象
- 以当前类作为日志对象,便于观察
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class LoggerTest {
private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
@Test
public void testLogger() {
System.out.println(logger.getName());
logger.debug("debug log");
logger.info("info log");
logger.warn("warn log");
logger.error("error log");
}
}
com.nowcoder.community.LoggerTest
2022-02-23 16:34:48,801 DEBUG [main] c.n.c.LoggerTest [LoggerTest.java:21] debug log
2022-02-23 16:34:48,802 INFO [main] c.n.c.LoggerTest [LoggerTest.java:22] info log
2022-02-23 16:34:48,802 WARN [main] c.n.c.LoggerTest [LoggerTest.java:23] warn log
2022-02-23 16:34:48,802 ERROR [main] c.n.c.LoggerTest [LoggerTest.java:24] error log
4. 版本控制:
- 分布式版本控制
官网
https://git-scm.com/book/zh/v2