首页 > 其他分享 >QQZone4 -总结

QQZone4 -总结

时间:2023-01-27 15:55:31浏览次数:35  
标签:总结 operate String Controller login QQZone4 IOC page

Servlet + thymeleaf 的java开发“套路”:

  1. 拷贝 myssm包

  2. 新建配置文件applicationContext.xml或者可以不叫这个名字,在web.xml中指定文件名

  3. 在web.xml文件中配置:

    1. 配置前缀和后缀,这样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>
      
    2. 配置监听器要读取的参数,目的是加载IOC容器的配置文件(也就是applicationContext.xml)

      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>applicationContext.xml</param-value>
      </context-param>
      
  4. 开发具体的业务模块:

    1) 一个具体的业务模块纵向上由几个部分组成:

    • html页面
    • POJO类
    • DAO接口和实现类
    • Service接口和实现类
    • Controller 控制器组件
      2) 如果html页面有thymeleaf表达式,一定不能够直接访问,必须要经过PageController
      3) 在applicationContext.xml中配置 DAO、Service、Controller,以及三者之间的依赖关系
      4) DAO实现类中 , 继承BaseDAO,然后实现具体的接口, 需要注意,BaseDAO后面的泛型不能写错。
    • 例如:
    public class UserDAOImpl extends BaseDAO<User> implements UserDAO{}
    

    5) Service是业务控制类,这一层我们只需要记住一点:

    • 业务逻辑我们都封装在service这一层,不要分散在Controller层。也不要出现在DAO层(我们需要保证DAO方法的单精度特性)
      • 当某一个业务功能需要使用其他模块的业务功能时,尽量的调用别人的service,而不是深入到其他模块的DAO细节

    6) Controller类的编写规则

    ① 在applicationContext.xml中配置Controller

    <bean id="user" class="com.atguigu.qqzone.controllers.UserController>
    那么,用户在前端发请求时,对应的servletpath就是 /user.do , 其中的“user”就是对应此处的bean的id值

    ② 在Controller中设计的方法名需要和operate的值一致
    • public String login(String loginId , String pwd , HttpSession session){
          return "index";
      }
      
    • 因此,我们的登录验证的表单如下:

    • <form th:action="@{/user.do}" method="post">
          <inut type="hidden" name="operate" value="login"/>
      </form>
      
    ③ 在表单中,组件的name属性和Controller中方法的参数名一致
    <input type="text" name="loginId" />
    
    public String login(String loginId , String pwd , HttpSession session){}
    
    ④ 另外,需要注意的是: Controller中的方法中的参数不一定都是通过请求参数获取的
    if("request".equals...) else if("response".equals....) else if("session".equals....){
        直接赋值
    }else{
        此处才是从request的请求参数中获取
            request.getParameter("loginId") .....
    }
    

    7) DispatcherServlet中步骤大致分为:

    • 从application作用域获取IOC容器

    • 解析servletPath , 在IOC容器中寻找对应的Controller组件

    • 准备operate指定的方法所要求的参数

    • 调用operate指定的方法

    • 接收到执行operate指定的方法的返回值,对返回值进行处理 - 视图处理

    8) 为什么DispatcherServlet能够从application作用域获取到IOC容器?

    ContextLoaderListener在容器启动时会执行初始化任务,而它的操作就是:

    1. 解析IOC的配置文件,创建一个一个的组件,并完成组件之间依赖关系的注入
    2. 将IOC容器保存到application作用域

http://localhost:8080/pro23/page.do?operate=page&page=login 访问这个URL,执行的过程是什么样的?

答:

http:// localhost :8080 /pro23 /page.do ?operate=page&page=login
协议 ServerIP port context root request.getServletPath() query string
  1. DispatcherServlet -> urlPattern : *.do 拦截/page.do

  2. request.getServletPath() -> /page.do

  3. 解析处理字符串,将/page.do -> page

  4. 拿到page这个字符串,然后去IOC容器(BeanFactory)中寻找id=page的那个bean对象 -> PageController.java

  5. 获取operate的值 -> page 因此得知,应该执行 PageController中的page()方法

  6. PageController中的page方法定义如下:
    public String page(String page){
    return page ;
    }

  7. 在queryString: ?operate=page&page=login 中 获取请求参数,参数名是page,参数值是login
    因此page方法的参数page值会被赋上"login"
    然后return "login" , return 给 谁??

  8. 因为PageController的page方法是DispatcherServlet通过反射调用的
    method.invoke(....) ;
    因此,字符串"login"返回给DispatcherServlet

  9. DispatcherServlet接收到返回值,然后处理视图
    目前处理视图的方式有两种: 1.带前缀redirect: 2.不带前缀
    当前,返回"login",不带前缀
    那么执行 super.processTemplete("login",request,response);

  10. 此时ViewBaseServlet中的processTemplete方法会执行,效果是:

    在"login"这个字符串前面拼接 "/" (其实就是配置文件中view-prefixe配置的值)

    在"login"这个字符串后面拼接 ".html" (其实就是配置文件中view-suffix配置的值)

    最后进行服务器转发

标签:总结,operate,String,Controller,login,QQZone4,IOC,page
From: https://www.cnblogs.com/Ashen-/p/17068947.html

相关文章

  • SQL Server 统计信息理解(总结)
    前言Sqlserver查询是基于开销查询的,在首次生成执行计划时,是基于多阶段的分析优化才确定出较好的执行计划。而这些开销的基数估计,是根据统计信息来确定的。统计信息其实就是......
  • 前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)
    前后端分离项目知识汇总​​前言​​​​整合Gateway网关​​​​网关相关配置​​​​全局Filter​​​​自定义异常处理​​​​整合配置中心​​​​为什么需要配置中心......
  • 前端面试题学习-个人总结
    前端面试题学习-HTML-个人总结这是看别人总结的基础上再度总结的,总结的链接如下链接1.DOCTYPE的作用?告知浏览器解析器用何标准解析文档,若不指定则按兼容模式进行解析......
  • 力扣只出现一次的数字系列总结(C++)
    tags:LeetCodeC++DSA写在前面最近用到的异或运算越来越多了,而其中又以只出现一次的数字为经典题型,下面总结总结一下只出现一次的数字系列.代码均为C++.前置知识逻辑......
  • 总结 CSS 伪类选择器 nth-child
    前言nth-child伪类选择器非常地好用,所以必须得掌握它,能够为我们简化不少的CSS代码。比如选择前n行元素、选择后n行元素、选择奇偶行元素、选择n倍元素等。其语法......
  • 总结:packaging类型值为pom的项目,无法通过package打包按钮生成jar文件,也无法通过mvn in
          把packaging类型值为pom给去掉,重新执行之前的操作,点击package按钮,就能看到生成target文件夹,并且在target文件夹下面也会看到有jar的文件把packagin......
  • 常用 Linux 命令总结
    1.基本命令uname-m 显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性h......
  • vue3中获取ref元素的几种方式总结
    1.原生js获取dom元素:document.querySelector(选择器)document.getElementById(id选择器)document.getElementsByClassName(class选择器)2.ref获取单个dom元素:<temp......
  • 编程与类型系统读后总结与感想
    1. 基本信息编程与类型系统 ProgrammingWithTypes:ExamplesinTypeScript[美]弗拉德·里斯库迪亚(VladRiscutia)著,赵利通译机械工业出版社,2021年1月出版1.1. ......
  • 2022前端年底面试总结
    又到年底了,很多小伙伴又开始​​跳槽​​​了,本次汇总都是​​面试真题​​​,来自各位小伙伴有​​大厂​​​也有​​小厂​​​,还有​​外包​​可以说很全面了。某外包公......