注解
- 注解存在的意义:简化 xml 文件的开发
- 注解在 servlet3.0 规范之后大力推广的
- 注解前面的@XXX,表示引用一个@interface
- @interface 表示注解声明
- 注解可以有属性,因为注解其实就是一个接口(类)
- 每次使用注解都需要导包
- 注解语法:@XXXX(属性名= 值)
- 值的分类
- 如果值是基本数据类型或字符串: 属性名=值
- 如果值是数组类型: 属性名={值,值}
- 如果只有一个值可以省略大括号
- 如果值是类类型,属性名=@名称
- 如果注解只需要给一个属性赋值,且这个属性是默认属性(value),可以省略属性名
路径
- 编写路径为了告诉编译器如何找到其他资源
- 路径分类
- 相对路径: 从当前资源出发找到其他资源的过程
- 绝对路径: 从根目录(服务器根目录或项目根目录)出发找到其他资源的过程
- 标志: 只要以/开头的都是绝对路径
- 绝对路径:
- 如果是请求转发, / 表示项目根目录(WebContent)
- 其他重定向,
- 如果客户端请求的控制器,控制器转发到JSP后,jsp中如果使用相对路径,需要按照控制器的路径去找其他资源(例如:控制器的WebServlet注解的value值是/abc/b,而该servlet内跳转到jsp,代表着在根目录下找虚拟路径abc下边的b资源,因此在jsp中用相对路径时可能会使用…/…/跳回上一级)
而跳转到jsp后,jsp内访问的路径如果是相对路径,原本可以显示,但因为是请求的跳转,地址栏不会变,因此跳转之后jsp内的路径会变为相对于请求处的位置
- 保险办法:使用绝对路径,可以防止上面的问题
相对路径指的是URL的相对关系,但是可能会在转发时出现页面资源路径错误的情况。我们再来看看绝对路径,绝对路径就是无论你在哪一层路径中,找到目标资源的路径写法都一样。一般绝对路径以“/”开头。不过,绝对路径虽然好写,但是它也分成两种情况——客户端路径和服务器端路径。
客户端路径和服务器端路径在写法上的表示就是客户端路径编写时需要以项目的虚拟目录开头编写,而服务器端路径必须省略项目的虚拟目录。那么怎么判断该使用客户端路径还是服务器端路径呢?这个也很简单,就看路径在哪被使用。如果路径在客户端被使用,那就是客户端路径,否则就是服务器端路径。下面我们举例说明:
在Servlet中重定向时,一般这么编写代码:response.sendRedirect("/test/aaa/test.jsp");这个地方的路径如果用绝对路径编写,我们看一下是那一端的路径。重定向是向浏览器返回响应,然后让浏览器根据响应回来的URL重新发送请求。所以这个路径是在浏览器重新发送请求时用到的,也就是在客户端被使用的,所以这个路径是客户端路径,编写时需要添加项目的虚拟路径/test开头。
如果是在Servlet中转发,一般这么编写代码:request.getRequestDispatcher("/aaa/test.jsp").forward(request,response);这个地方的路径如果用绝对路径编写,我们看一下是那一端的路径。转发时在服务器内部的跳转行为,在客户端根本感知不到,所以这个路径是服务器使用的,也就是服务器端路径,编写时省略项目虚拟目录,不用以/test开头。
Log4J
- 由 apache 推出的开源免费日志处理的类库
- 为什么需要日志:
- 在项目中编写 System.out.println();输出到控制台,当项目发布到 tomcat 后,没有控制台(在命令行界面能看见),不容易观察一些输出结果
- log4j作用,不仅能把内容输出到控制台,还能把内容输出到文件中,便于观察结果
- 使用步骤:
- 导入 log4j-xxx.jar
- 在 src 下新建 log4j.properties(路径和名称都不允许改变)
- ConversionPattern:写表达式 3.2.2 log4j.appender.LOGFILE.File 文件位置及名称(日 志文件扩展名.log)
# 旧版本写法,新版参考配置文件笔记 log4j.rootCategory=DEBUG, CONSOLE ,LOGFILE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppend er log4j.appender.CONSOLE.layout=org.apache.log4j.Patter nLayout log4j.appender.CONSOLE.layout.ConversionPattern=%C %d{YYYY-MM-dd hh:mm:ss} %m %n log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=E:/my.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.Patter nLayout log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n
- log4j 输出级别
- fatal(致命错误) > error (错误) > warn (警告) > info(普通信息)>debug(调试信息)
- 在 log4j.properties 的第一行中控制输出级别
- log4j 输出目的地
- 在一行控制输出目的地
- pattern 中常用几个表达式
- %C 包名+类名
- %d{YYYY-MM-ddHH:mm:ss} 时间
- %L 行号
- %m 信息
- %n 换行
settings 标签
- 在 mybatis 全局配置文件中通过标签控制 mybatis 全局开关(加在environments之前)
... <settings> <setting name="logImpl" value="LOG4J"/> </settings> ...
- 在 mybatis.xml 中开启 log4j
- 必须保证有 log4j.jar
- 在 src 下有 log4j.properties
- log4j 中可以输出指定内容的日志(控制某个局部内容的日志级别)
-
命名级别(包级别):namespace 属性中除了最后一个类名(控制输出同包的运行信息)
例如: namespace=”com.bjsxt.mapper.PeopleMapper” 其中包级别为com.buendia.mapper
需要在 log4j.propeties 中(过滤无用信息)-
先在总体级别调成 Error不输出无用信息
-
在设置某个指定位置级别为DEBUG
-
-
类级别(namespace=“a.b”,则所有a.b开头的都会输出)
- namespace 属性值 ,namespace 类名
-
方法级别
- 使用 namespace 属性值+标签 id 属性值
parameterType属性
- 在XXXMapper.xml中等标签的 parameterType 可以控制参数类型
- SqlSession 的 selectList()和 selectOne()的第二个参数和 selectMap()的第三个参数都表示方法(XxxMapper.xml中的方法)的参数
示例:
People p = session.selectOne("a.b.selById",1); System.out.println(p);
在 Mapper.xml 中可以通过 #{} 获取参数
- parameterType 控制参数类型
- #{} 获取参数内容
- 使用索引,从 0 开始 #{0}表示第一个参数
- 也可以使用#{param1}第一个参数(注意和上边直接写0的区别,一个0,一个1)
- 如果只有一个参数(基本数据类型或 String),mybatis对#{}里面内容没有要求只要写内容即可(自动直接找传进来的参数)
- 如果参数是对象 #{属性名}
- 如果参数是 map 写成 #{key}
<select id="selById" resultType="com.bjsxt.pojo.People" parameterType="int"> select * from people where id=#{0} </select>
- #{} 和 ${} 的区别
- #{} 获取参数的内容支持 索引获取,param1获取指定位置参数,并且 其中生成的SQL 是使用?占位符
- 字 符 串 拼 接 , 不 使 用 ? , 默 认 找 {} 字符串拼接,不使用?,默认找 字符串拼接,不使用?,默认找{内容}内容的 get/set 方法,如果写数字,就是一个数字
- 如果在 xml 文件中出现 “<”,“>”,双引号 等特殊字符时可以使用XML 文件转义标签(XML 自身的) <![CDATA[ 内容 ]]>
- mybatis 中实现 mysql 分页写法
- ?不允许在关键字前后进行数学运算,需要在代码中计算完成后传递到 mapper.xml 中
- 在 java 代码中计算
//显示几个 int pageSize = 2; //第几页 int pageNumber = 2; //如果希望传递多个参数,可以使用对象或 map Map<String,Object> map = new HashMap<>(); map.put("pageSize", pageSize); map.put("pageStart", pageSize*(pageNumber-1)); List<People> p = session.selectList("a.b.page",map);
- 在 mapper.xml 中代码
<select id="page" resultType="com.bjsxt.pojo.People" parameterType="map"> select * from people limit #{pageStart},#{pageSize} </select>
typeAliases 别名
- 系统内置别名: 把类型全小写
- 给某个类起别名
- alias=”自定义”
Mybatis.xml中添加:
<typeAliases> <typeAlias type="com.buendia.entity.People" alias="peo"/> </typeAliases
- mapper.xml 中 peo 引用 People 类
<select id="page" resultType="peo" parameterType="map"> select * from people limit #{pageStart},#{pageSize} </select>
- 直接给某个包下所有类起别名,别名为类名,不区分大小写
- mybatis.xml 中配置
<typeAliases> <package name="com.buendia.entity" /> </typeAliases>
- mapper.xml 中通过类名引用
<select id="page" resultType="People" parameterType="map"> select * from people limit #{pageStart},#{pageSize} </select>
``
- mapper.xml 中通过类名引用
<select id="page" resultType="People" parameterType="map"> select * from people limit #{pageStart},#{pageSize} </select>
- 如果客户端请求的控制器,控制器转发到JSP后,jsp中如果使用相对路径,需要按照控制器的路径去找其他资源(例如:控制器的WebServlet注解的value值是/abc/b,而该servlet内跳转到jsp,代表着在根目录下找虚拟路径abc下边的b资源,因此在jsp中用相对路径时可能会使用…/…/跳回上一级)