赞
踩
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....)用来接收用户请求,并分配任务给模型层
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。