JAVASSM

JAVASSM

day1-spring&ioc
框架:web层+service层+dao层
ssh:Struts2(有安全漏洞,已弃用)+Spring+Hibernate(不够灵活)
ssm:SpringMVC+Spring+MyBatis
两方面:
ioc控制反转(di依赖注入)
aop面向切面编程
ioc控制反转的配置方式:
<?xml version="1.0" encoding="UTF-8"?>
<p:beans xmlns:p="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd ">
</p:beans>
ioc控制反转获取对象的方式:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = (Person) context.getBean("person");
常用的设计模式共有23种
多例:scope="prototype"
懒加载:lazy-init="true"
全局懒加载:default-lazy-init="true"
多例情况下不需要配置懒加载
创建:init-method="init"
销毁:destroy-method="destroy"
List/Set/Map/Properties(映射)(key和value都为String的映射,可以保存在文件中)
autowire自动装载:byName/byType
全局自动装配:default-autowire="byName"
di依赖注入:在创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过程之为依赖注入DI

day2-annotation
javap:反编译
注释:给人看的提示信息,人看了提示信息了解程序的内容
注解:给程序看的提示信息,程序看后可以根据有无注解及注解上属性的不同配置执行不同的逻辑。
注解中只有一个value的时候,可以省略等号及等号前的部分
only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof
元注解:给注解注解的注解
四个元注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
RetentionPolicy.SOURCE:此注解会被保留到源码阶段,.java中,在编译过程中被删除。
这种类型的注解通常是给编译器看的。
RetentionPolicy.CLASS:此注解将会被保留在源码阶段 和 编译阶段 ,.java和.class中,在类加载的过程中被删除。
这种类型的注解通常是给类加载器看的。
RetentionPolicy.RUNTIME:此注解将会被保留在源码阶段 、编译阶段 和 运行阶段,.java .class和内存中的字节码中都会存在。
这种类型的注解通常用来在运行阶段进行反射,控制程序运行过程。
**只有RUNTIME级别的注解才可以通过反射技术进行反射。
@Documented是否被提取到文档中
@Inherited表示被注解类的子类也会被注解
反射注解:
isAnnotationPresent(annotationClass);
getAnnotation(annotationClass);
getAnnotations();
spring注解的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd
">
</beans>
注解开启包扫描:<context:component-scan base-package="cn.tedu.domain"></context:component-scan>
@Component注解:如果首字母是大写,并且第二个字母不是大写,那么默认会将首字母转换为小写作为类(bean)的id。如果第二个字母是大写,那么会按照类名作为类(bean)的id。
@Component("abc")注解:可以强制性指定id
开启注解方式配置di:<context:annotation-config></context:annotation-config>
注解使用文件保存信息:<context:property-placeholder location="classpath:/data.properties" />
@Autowired自动装配注解:先按id找,再按类型找,如果都不存在则报异常。如果属性是一个接口,那么会先找bean id,如果找不到会根据属性类型寻找,会去寻找接口的实现类,
@Qualifier("dogx")强制指定id(spring提供)
@Resource(name="dogx")也可以强制指定id(java提供)
@Value("abc")实现注入值
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)单例和多例
@Lazy单例时会用到懒加载
@PostConstruct加载方法
@PreDestroy销毁方法
四个相同的注解:
@Component通用的注解
@Controller控制层web层
@Service业务层service层
@Repository数据层dao层

day3-proxy
Golang语言:没有对象,协程,天然支持高并发
代理解决的问题:
1.减少代码的重复
2.将功能性代码和业务逻辑代码分开
两者都可以实现,但不符合设计初衷:
重写主要应用于子类覆盖父类的方法
装饰者设计模式主要用于对原有的类添加方法进行增强,而不是直接修改原来的代码
总结两点:
1.代理模式强调的是控制,装饰模式强调的是增强。
2.代理模式强调的是透明访问,装饰模式强调的是自由构建。
静态代理:手动创建代理者,解决了将功能性代码和业务逻辑代码分开的问题
动态代理:自动创建代理者,解决了两个问题
两种方法都可以获取到类:kk.getClass()=CXK.class
jdk内置代理:
Proxy.newProxyInstance
java的动态代理是通过代理者实现和被代理者相同的接口来保证两者具有相同的方法的,如果被代理者想要被代理的方法不属于任何接口,则生成的代理者自然无法具有这个方法,也就无法实现对该方法的代理。所以java的动态代理机制是基于接口进行的,受制于要代理的方法是否有接口的支持。
cglib:
Enhancer en = new Enhancer();
en.setSuperclass(us.getClass());
en.setCallback(new MethodInterceptor() {});
优点:无论是否有接口都可以实现动态代理,使用场景基本不受限
缺点:第三方提供的动态代理机制,不是原生的,需要导入第三方开发包才可以使用

day4-aop
父类private修饰的也可以被继承,但是无法被调用
切入点表达式:
粗粒度表达式:within(cn.tedu.service.UserServiceImpl)
细粒度表达式:execution(void vn.tedu.service.UserServiceImpl.registUser(cn.tedu.domain.User))
service包下全部拦截:execution(* cn.tedu.service..*(..))
通知顺序会被xml中配置的顺序所影响
当有多个切面(aspect)时,以责任链模式执行(ABCXCBA)
五种通知类型:before、around、after-returning、after-throwing、after
前置通知:记录日志(方法将被调用)
环绕通知:控制事务和权限控制
后置通知:记录日志(方法已经成功调用)
异常通知:异常处理和控制事务
最终通知:记录日志(方法已经调用,但不一定成功)
spring自动为目标对象生成代理对象,默认情况下,如果目标对象实现过接口,则采用java的动态代理机制,如果目标对象没有实现过接口,则采用cglib动态代理。开发者可以可以在spring中进行配置,要求无论目标对象是否实现过接口,都强制使用cglib动态代理。
通用切入点:其他的调用mm()即可
@Pointcut("execution(* cn.tedu.service.*.*(..))")
public void mm() {}
转换成list:Arrays.asList(privs)
把调用接口转成调用实现类:
MethodSignature ms = (MethodSignature) pjp.getSignature();
// 获取的默认是接口的方法,需要获取的是实际运行时调用的方法
Method method = ms.getMethod();
// 获取目标对象
Object targetObj = pjp.getTarget();
// 获取实际调用的方法
Method instanceMethod = targetObj.getClass().getMethod(method.getName(), method.getParameterTypes());

day5-threadlocal&springjdbc
编译时是Object,运行时是String:
Object o="abc";
System.out.println(o);
编译时是接口,运行时注入变成实现类:
@Autowired
private IUserService ius;
进程:正在内存中执行的程序
线程:进程的一个单元,在代码调用方法时执行
线程并没有真正提高代码的执行效率,但是提高了利用率
造成线程安全隐患三个条件:有多条线程,有共享资源,有写操作时,去掉三者之一就可以避免线程安全隐患
有多条线程:通过加锁(Lock)(synchronized)解决
有共享资源:通过本地线程变量(ThreadLocal)解决
有写操作时:以线程通信来共享资源(新思想),以共享资源来通信(旧思想)
jdbc:java操作关系型数据库的api
c3p0:jdbc每次都要创建关闭连接,很消耗资源,所以引入了c3p0连接池
xml配置方式:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql//10.8.24.191/mydb2</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>

day6-springmvc
springjdbc中的回滚,只针对运行时异常RuntimeException,编译时异常IOException不会回滚,需要手动处理
所有都回滚的配置:rollback-for="java.lang.Throwable"
springmvc是一个web层、控制层框架,主要用来负责与客户端交互和业务逻辑的调用
SpringMVC的组件:
a.前端控制器(DispatcherServlet)
b.处理器映射器(HandlerMapping)
c. 处理器适配器(HandlerAdapter)
d.视图解析器(ViewResolver)
e.视图渲染(View)
Handler需要的注解:
@Controller
@RequestMapping:可用在方法和类上面,参数可以放多个地址
可以接收Request和Response对象来使用,也可以直接获取参数
如果请求参数中存在多个同名值,此时直接获取会得到一个用逗号分隔的字符串,也可以修改Controller方法的形参为数组类型直接接收到一个数组
文件上传表单必须满足如下三个条件:
1.表单必须是Post提交
2.表单必须是enctype="multipart/form-data"
3.文件上传项必须有name属性

day7-mybatis
请求重定向 和 请求转发都是web开发中资源跳转的方式
请求转发是服务器内部的跳转:
地址栏不发生变化
只有一个请求响应
可以通过request域传递数据
请求重定向是浏览器自动发起对跳转目标的请求:
地址栏会发生变化
两次请求响应
无法通过request域传递对象
四大作用域原有方式:
request:SpringMVC默认使用的是request域
session:可以在处理的形参中直接获取HttpSession对象,也可以现在处理器的形参中获取HttpServletRequest,然后在间接的获取session
servletContext:可以现在处理器的形参中获取HttpServletRequest,然后在间接的获取servletContext
pageContext
注解方式传递数据:@SessionAttributes("msg")
注解参数:@ModelAttribute
异常的拦截方法:@ExceptionHandler
全局异常的拦截在类上面加:@ControllerAdvice
寻找视图的过程:先根据返回的字符串寻找对应的jsp,如果没有返回值,那么根据路径名去寻找相同名称的jsp,如果还是没有找到则出现异常
返回json的注解:@ResponseBody
处理器方法支持的参数类型和返回值类型:
a. 支持的方法参数类型:
i.HttpServletRequest:代表当前请求的对象
ii.HttpServletResponse:代表当前响应的对象
iii.HttpSession:代表当前会话的对象
iv.WebRequest:SpringMVC提供的对象,相当于是request和session的合体,可以操作这两个域中的属性。
v.InputStream OutputStream Reader Writer:代表request中获取的输入流和response中获取的输出流
vi.通过@PathVariable @RequestParam声明的方法参数:
@PathVariable可以将请求路径的指定部分获取赋值给指定方法参数
@RequestParam可以将指定请求参数赋值给指定方法参数,如果不写此注解,则默认会将同名的请求参数赋值给方法参数
vii.通过@CookieValue和@RequestHeader声明的方法参数:
@CookieValue可以将请求中的指定名称的cookie赋值给指定方法参数
@RequestHeader可以将请求参数中的指定名称的头赋值给指定方法参数
viii.Model和ModelMap和java.util.Map:向这些Model ModelMap Map中存入属性,相当于向模型中存入数据
ix.Bean类:SpringMVC自动将请求参数封装到bean
x.MultipartFile:实现文件上传功能时,接收上传的文件对象
xi.Errors BindingResult:实现数据验证的参数
b.支持的返回值类型:
i.ModelAndView:可以返回一个ModelAndView对象,在其中封装Model和View信息
ii.View:可以直接返回一个代表视图的View对象
iii.字符串:直接返回视图的名称
iv.void:如果返回值类型是void,则会自动返回和当前处理器路径名相同的视图名
v.方法被@ResponseBody修饰:当方法被@ResponseBody修饰时,默认将返回的对象转为json写入输出
vi.除以上之外返回的任何内容都会被当做模型中的数据来处理,而返回的视图名等同于当前处理器路径名
mybatis操作:
1.读取mybatis核心配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
2.根据配置文件创建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//关闭输入流
is.close();
3.获取SqlSession 会话
SqlSession session = ssf.openSession();
4.执行sql语句
List<User> listUser = session.selectList("cn.tedu.domain.mybatis.UserMapper.selectAll");
5.输出数据
System.out.println(listUser);
mybatis自动开启事务,但不会自动提交,需要手动提交事务:session.commit();
#{}在引用时,如果发现目标是一个字符串,则会将其值作为一个字符串拼接在sql上
${}在引用时,即使发现目标是一个字符串,也不会作为字符串而是直接使用将其拼接到sql上
所以通常情况下,使用#{},而如果需要引用的是一个列名,使用${}
set标签会自动去掉最后一个逗号,where标签会自动去掉第一个and

day8-ssm
多表连接的resultMap用法:
一对一:association(javaType)
一对多:collection(ofType)
多对多:collection(ofType)
别名标签:<typeAlias type="cn.tedu.domain.User" alias="u"></typeAlias>
sql重用标签:sql
MyBatis的缓存机制:
一级缓存:缓存只在一个事务中有效(同一次SqlSession会话为一次事务)
二级缓存:缓存在全局有效
MyBatis的一级缓存默认就是开启的,经测试flushCache="true"无法关闭一级缓存
关闭打开session可以打断一级缓存:
session.close();
session = ssf.openSession();
接口的开发需要五点相同:名字,方法,参数,返回类型,位置

posted @ 2019-07-25 21:49  老孙来也  阅读(303)  评论(0编辑  收藏  举报