关于JavaWeb学习的几个小点

197 阅读4分钟

声明:本人是跟着B站尚硅谷新版JavaWeb进行的学习,首先感谢尚硅谷! 尚硅谷丨2022版JavaWeb教程(全新技术栈,全程实战)_哔哩哔哩_bilibili
作为初学者,自然是有理解与认知上的偏差的,希望各位海涵,且不吝赐教。

thymeleaf 视图模板技术

image.png 刚来贵社区,代码段只能写前端的吗?(小白发问)

<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组件:\

  1. 从 url 中提取servletPath: /fruit.do -> fruit\
  2. 根据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 - 依赖注入
控制反转:\

  1. 之前在Servlet中,我们创建service对象 , FruitService fruitService = new FruitServiceImpl();
    这句话如果出现在servlet中的某个方法内部,那么这个fruitService的作用域(生命周期)应该就是这个方法级别;
    如果这句话出现在servlet的类中,也就是说fruitService是一个成员变量,那么这个fruitService的作用域(生命周期)应该就是这个servlet实例级别\
  2. 之后我们在applicationContext.xml中定义了这个fruitService。然后通过解析XML,产生fruitService实例,存放在beanMap中,这个beanMap在一个BeanFactory中
    因此,我们转移(改变)了之前的service实例、dao实例等等他们的生命周期。控制权从程序员转移到BeanFactory。这个现象我们称之为控制反转
    依赖注入:\
  3. 之前我们在控制层出现代码:FruitService fruitService = new FruitServiceImpl();
    那么,控制层和service层存在耦合。\
  4. 之后,我们将代码修改成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实例:

image.png 选取service层OrderServiceImpl一小段代码看解耦:

image.png 其实内容很多,本文只选了其中的几个知识点来分享,文中若有不妥当及错误之处,还请谅解,多赐教,我还是小白,希望慢慢变好。感谢阅读!