JavaWeb学习笔记(总结)

http://localhost:8080/qqZone_ssmjar/page.do?operate=page&page=login

一、访问这个URL,执行的过程是什么样的?

1)中央控制器DispatcherServlet拦截(urlPattern -> *.do) ,再通过request.getServletPath()获取到"/page.do"

2)处理字符串,将/page.do变为page,用page当作key去IOC容器(BeanFactory)中寻找value值,即PageController对象。IOC容器是在ServletContextListener(监听ServletContex的初始化和摧毁)的实现类的init方法(在服务器启动时就会创建ServletContex对象,创建完后就会执行此初始化方法)中会去创建IOC容器类(ClassPathXmlApplicationCOntext)的对象,在该对象的构造器中就会读取src\applicationContext.xml文件,创建该文件下保存的类路径对象,并注入依赖,最后存在Map<String, Object>    beanMap中。init方法中会将此IOC对象存储在application作用域中

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

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

5)DispatcherSevlet中会调用page方法,并分析出需要名为page变量,就去queryString中获取,发现有,就获取到page=login,并传入page方法,page方法又将page=login返回给DispatcherSevlet,目前处理视图的方式有两种: 1.带前缀redirect:(重定向)    2.不带前缀(渲染逻辑名为返回值的html文件)。     

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

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

当前,返回"login",不带前缀,所以渲染login.html文件

二、.目前进行javaweb项目开发的“套路”是这样的:

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)配置监听器

<listener>
    <listener-class>com.zjh.myssm.listeners.ContextLoaderListener</listener-class>
</listener>

        3) 配置监听器要读取的参数,目的是加载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组件中的方法应该是单精度的增删改查,不要参杂业务逻辑

         5)Service组件中的方法是考虑业务逻辑的要基于DAO组件方法的调用,业务逻辑我们都封装在service这一层不要分散在Controller层。也不要出现在DAO层。当某一个业务功能需要使用其他模块的业务功能时,尽量的调用别人的service,而不是深入到其他模块的DAO细节。

          6)Controller类的编写规则

                ①在applicationContext.xml中配置Controller

        <bean id="user" class="com.zjh.qqZone.controller.UserController">
                <!--name该类中的变量名, ref是所对应的bean中的id属性-->
            <property name="userBasicService" ref="userBasicServiceImpl"/>
            <property name="topicService" ref="topicServiceImpl"/>
        </bean>

                ②在Controller中设计的方法名需要和从前端传入的operate的值一致

                ③ 在表单中,组件的name属性和Controller中方法的参数名一致,直接在地址栏中的queryString拼接传入数据时属性名也要和Controller中方法的参数名一致(因为是根据反射获取方法中的形参名去结果集中获取该数据的,获取到的是String,如果方法要的不是String会进行转型)

                ④另外,需要注意的是: Controller中的方法中的参数不一定都是通过请求参数获取的
                  if("request".equals...) else if("response".equals....) else if("session".equals....){
                    直接赋值
                  }else{
                    此处才是从request的请求参数中获取
                    request.getParameter("loginId") .....

         7)DispatcherServlet中的步骤大致分为:

                1.从application域中获取IOC容器

                2.解析req.getservletPath()获取到的字串,拿到id去IOC容器中获取对应的Controller类

                3.拿到operate的值,通过反射去该Controller中去寻找名为operate值的方法

                4.拿到之后获取需要的参数,通过参数名去请求体或queryString中获取名为该参数名的值,如果类型不是String就转型;request、response、session就直接传入

                5.调用该方法,并拿到返回值,是一个String字符串

                6.根据字符串去判断是重定向还是渲染html页面

三、图解架构(来自尚硅谷JavaWeb)

 四、MVC架构模式

        M 模型层:包含pojo(plain ordinary java object    简单java对象)、业务层组件(Service)、数据访问层组件(DAO)....

        V 视图层:用作数据展示以及和用户交互的界面

        C 控制层:(Servlet、Controller....)用来接收用户请求,并分配任务给模型层

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值