List集合的三种遍历删除:
1.普通for循环,可以删除,但是索引要–。这种情况是当两个相同的元素挨着的时候,判断完第一个,索引向后移动会把下面需要判断的一个漏掉。
2.迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常。
3.增强for不能删除。
所谓的web应用,就是一个目录,其中包含很多大的web资源html等。
webapps下不能直接放资源,要放文件目录,相当于一个web应用。
在Tomcat中有虚拟主机,名为localhost;
可以将一个web应用打成zip包,然后改为一个war包。直接目录里面压缩,然后添加到压缩文件,完成将后缀改为.war。
不要和已有的web目录的文件名相同,否则不能自动解压。
放到Webapps下会自动减压。不要有中文的文件名,将来可能无法自动解压。
url-pattern中配置的斜杠(/)表示将除了JSP以外的其他请求都拦截下来,交给spring的前端控制器来处理。
但是这样配置,会将对静态资源的访问也拦截下来,导致访问静态资源时,出现404(资源找不到),因为spring的前端控制器将对静态资源的访问也当成了一个controller请求,去配置对应的映射路径,这当然找不到。
400错误是因为前段页面格式存在错误造成的。
Server server = t.getServer();
// 还可以通过设置断点的来得到具体的实现类
System.out.println(server.getClass()); // 怎么知道一个接口的具体实现的类型,可以通过接口对象的getClass()方法,的到具体的实现类StandardServer。
说明:@Bean注解要配合@Configuration注解使用,@Configuration用于描述类.
Spring MVC请求处理主要从如下几个方面进行考虑:
- 请求路径(普通方式,rest方式) :404
- 请求方式(Get请求,Post请求,…):405
- 请求参数(直接量,POJO对象,MAP对象):400
ip地址的最后一个部分是端口号。1.打开cmd命令窗口,输入如下指令可以查看所有端口和PID。 netstat -ano
2.找到对应的端口对应的PID查看进程: tasklist|findstr “2323”
3.杀死进程:taskkill /f /t /im java.exe
this关键字,谁来调用我这个方法,我就代表谁。
前端传过来的参数名称必须和服务端接收的参数名称完全相同。不相同的话就不能对应上值。
resource->static这个文件下的内容放的是css,js,image等静态资源,也可以放html
- resource->templates这个文件夹下放的是具体的页面,浏览器不能直接访问,必须通过页面转发跳转等才可以访问。
dao接口这一层可以使用@Mapper来扫描,也可以在启动扫描层添加@MapperScan(dao接口包)。
自定义异常一般实现runtimeExcepton就行,如果直接继承Exception,这个编译时异常要一直处理抛出,麻烦。
多表关系查询一般使用一张中间表来产生关系。
查询上级目录可以采用自关联查询。
使用左连接,把为null也显示出来 查询所有菜单以及菜单对应的上级菜单信息。左边表中为null的值。
sql异常错误一定要检查sql语句写的是否符合语法规范。接口命名空间当中不要有空格。字段要和数据库的字段保持一致。
断点调试的时候,如果进入了不想进入的方法,可以在接下来执行的操作方法中加一个断点,然后直接跳到这个断点。也可以前后端一起进行debugger
useGeneratedKeys=“true”
keyProperty=“id”>
一对多的查询,关系一般放到多的一方。
resultMap type=“com.cy.pj.sys.vo.SysUserDeptVo”
id=“sysUserDeptVo”>
当设计到多个表关联查询的时候,结果要封装到一个vo类当中。用来保存数据。
事务要放到业务层。
int getCount(); 查询总记录数胡mapper.xml的时候必须写返回结果resultType=“int”。
当有多个关联查询胡时候,可以多张表一起查,通过起别名然后通过where来判断id相等。where e.id=j.id AND e.dept_id= d.id;
对象转换为json的时候,必须调用对象的get方法
- json串转换为对象的时候,调用对象的set方法
- set和get方法必须成对出现。则json转化正确。如果特殊情况可以加@JsonIgnoreProperties(ignoreUnknown=true) //表示JSON转化时忽略未知属性。
对maven执行操作的时候,可以执行强制更新。这样就可以防止进度条不加载的问题。
使用result风格,就是通过路径来拼接参数。获取的时候路径/{model}/{num}等用{}包裹起来。参数获取时记得前面要加@Pathvarible注解。
可以通过request来获取cookie,然后通过response来添加cookie。
还可以request来获取用户的ip地址。
参数可以做一个非空判断,防止空指针异常。
开始一个项目,首先是导入环境。pom.xml当中的文件要进行依赖导入。如果是一个服务器需要启动就要添加打包的插件。还要添加公共的依赖。
首先是建立一个与表一一对应的pojo,然会写Mapper。Service。等。
“/”springmvc可以进行自动添加。
@Configuration // 表示这是一个配置类 这就相当于web.xml
public class MvcConfigurer implements WebMvcConfigurer{
/**
* 添加用户的拦截器,表示拦截器生效
* url:localhost:8090/addUser/a/b
* /** 表示拦截所有(多级)的请求
* /* 表示拦截一级目录请求
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInterceptor).addPathPatterns(“/cart/“,”/order/”);
}
/**
- 定义拦截器 拦截器需要重点学习,必须配合重定向使用。
- 继承一个拦截器的接口HandlerInterceptor
- 拦截器配置以后才起作用,光写不起作用
- @author TEDU
*/
@Component // 表示交给spring容器管理
public class UserInterFaceptor implements HandlerInterceptor {
boolean:true放行 false拦截,必须配合重定向使用。
springmvc定义拦截器需要实现一个接口HandlerInterceptor ,重写里面的方法,有三个方法,分别是前增强/后增强/封装完结果页面增强。handler处理器就相当于执行三层当中的方法。
/**
- 使用ThreadLocal来共享数据,将数据保存到当前的线程当中
- @author TEDU
*/
public class UserThreadLocal {
// 如果存储多个数据的 时候使用Map集合ThreadLocal<Map<key,value>>
private static ThreadLocal thread = new ThreadLocal<>();
public static void setUser(User user) {
thread.set(user);
}
public static User getUser() {
return thread.get();
}
// 防止内存溢出,必须添加移除的方法
public static void remove() {
thread.remove();
}
}