声明:本人是跟着B站尚硅谷新版JavaWeb进行的学习,首先感谢尚硅谷!
尚硅谷丨2022版JavaWeb教程(全新技术栈,全程实战)_哔哩哔哩_bilibili
作为初学者,自然是有理解与认知上的偏差的,希望各位海涵,且不吝赐教。
thymeleaf 视图模板技术
刚来贵社区,代码段只能写前端的吗?(小白发问)
<context-param>
<param-name>view-prefix</param-name>
<param-value>/</param-value>
</context-param>
<context-param>
<param-name>view-suffix</param-name>
<param-value>.html</param-value>
</context-param>
物理视图=视图前缀+逻辑视图+视图后缀
| 视图前缀 | 逻辑视图 | 视图后缀 | 物理视图 |
|---|---|---|---|
| /pages/user/ | login | .html | /pages/user/login.html |
| /pages/user/ | login_success | .html | /pages/user/login_success.html |
所以在进行页面跳转时可直接 return “逻辑视图”(好像也没什么重要的。。。)
DispathcherServlet
DispatcherServlet这个类的工作分为两大部分
1 根据url定位到能够处理这个请求的controller组件:\
- 从 url 中提取servletPath: /fruit.do -> fruit\
- 根据fruit找到对应的组件:FruitController ,这个对应的依据是我们存储在applicationContext.xml中
通过DOM技术我们去解析xml文件 在中央控制器形成一个beanMap容器 用来存放所有Controller组件
3) 根据获取到的operate值定位到FruitController中需要调用的方法
2 调用Controller组件的方法:
1)获取参数
获取要调用方法的参数签名
Parameter[] parameters = method.getParameters();
通过parameter.getName()获取参数的名称
通过parameter.getType()获取参数的类型
Object[] parameterValues 来存放对应参数值
有时需要做类型转换的工作
2)执行方法
Object returnObj = method.invoke(controllerBean,parameterValues);
3)视图处理
String returnStr = (String) returnObj;
if(returnStr.startWith("redirect:")) {
...
}else if ...
后面接上Web书城的小项目,可以感受一下这个逻辑:
相较于每个方法对应一个Servlet确实清晰了很多,后面继续讲解了servlet初始化方法、配置讲解、业务层、ioc、过滤器、事务管理等知识,浓度较大,吸收了对将来的框架学习大有裨益。
IOC
为实现高内聚,低耦合
Ioc 不是一种技术,只是一种思想 ,一个重要的[面向对象编程]的法则,它能指导我们如何设计出松耦合、更优良的程序。
控制反转是通过依赖注入实现的,其实它们是同一个概念的不同角度描述。通俗来说就是 Ioc是设计思想,DI是实现方式 。
IOC - 控制反转 / DI - 依赖注入
控制反转:\
- 之前在Servlet中,我们创建service对象 , FruitService fruitService = new FruitServiceImpl();
这句话如果出现在servlet中的某个方法内部,那么这个fruitService的作用域(生命周期)应该就是这个方法级别;
如果这句话出现在servlet的类中,也就是说fruitService是一个成员变量,那么这个fruitService的作用域(生命周期)应该就是这个servlet实例级别\ - 之后我们在applicationContext.xml中定义了这个fruitService。然后通过解析XML,产生fruitService实例,存放在beanMap中,这个beanMap在一个BeanFactory中
因此,我们转移(改变)了之前的service实例、dao实例等等他们的生命周期。控制权从程序员转移到BeanFactory。这个现象我们称之为控制反转
依赖注入:\ - 之前我们在控制层出现代码:FruitService fruitService = new FruitServiceImpl();
那么,控制层和service层存在耦合。\ - 之后,我们将代码修改成FruitService fruitService = null ;
然后,在配置文件中配置.(所以,要学习bean标签)
<bean id="fruit" class="FruitController">\
<property name="fruitService" ref="fruitService"/>\
</bean>
将bean全部添加到beanmap中
bean标签
- Bean的配置一般都在XML文件进行配置
- Bean相关包为:org.springframework.beans和org.springframework.context
- spring的Bean管理的实现是依靠大量的反射来实现的。
- id: 是bean的唯一标识,IoC容器中bean的id标签不能重复,否则报错。用于指定Bean的名称,在Bean被依赖时使用,在获取Bean时使用等
- name: 用于指定Bean的别名,bean标签的name属性也是不能重复,且id和name属性也不能重复,name标签应该等同于id属性。
- class : 用来定义类的全限定名(包名+类名)。只有子类Bean不用定义该属性。
property标签
- name属性:用于指定属性的名称,与类中的set方法后方的名称一致
- value属性:用于指定该属性的值,用于指定的值是基本类型、字符串类型
- ref属性:用于指定该属性的值,用于指定的值是引用对象类型(即其他的Bean),ref后面的值为另一个Bean的id
- value标签:用于指定属性的值,类型为基本类型、字符串类型,值为标签内的文本内容,可以使用null值将属性的值设置为null
- ref标签:用于指定属性的值,类型为引用对象类型,值为其属性的值
看ioc实例:
选取service层OrderServiceImpl一小段代码看解耦:
其实内容很多,本文只选了其中的几个知识点来分享,文中若有不妥当及错误之处,还请谅解,多赐教,我还是小白,希望慢慢变好。感谢阅读!