发表于: 2017-10-26 17:37:41

1 718


今天完成的事

【一,学习springmvc】

pring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分等等等。。。

停!这都是官方的话,我就想知道是怎么用的。

现实按博客理解了一下springMVC。我就先把思路画出来。

我在搭建一个ssm的时候路线应该是下面的12345678。




灵魂画手。但是逻辑上应该不会太差。


【springMVC配置文件】

配置文件。

web.xml文件


鉴于第一次搭建,我把配置文件里面的每一个东西干嘛用的至少要理清楚。


第一个。<servlet>标签

1,这个是我们要注册servlet的名字,一般跟Servlet类名有关

2,这个是这个就是指向我们要注册的servlet 的类地址, 要带包路径

3,就是要指定核心配置文件路径,定义了要装入SpringMvc配置文件的路径。

       contextConfigLocation:全局初始化的配置文件

4,所要加载的SpringMvc配置文件。

5,加载的顺序。


第二个标签 <servlet-mapping>标签



<servlet-mapping>标签声明了与该servlet相应的匹配规则,每个<url-pattern>标签代表1个匹配规则。

这个要好好理解一下,匹配规则是干嘛用的呢。


当浏览器发起一个url请求后,该请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如url是http://10.43.11.143/myapp/kata/detail.html,其应用上下文是myapp,容器会将http://10.43.11.143/myapp去掉,剩下的/kata/detail.html部分拿来做servlet的映射匹配。这个映射匹配过程是有优先顺序的(具体的优先顺序规则后面介绍),而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。

注意Filter的匹配规则与servlet一样,但对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。 

以下来自文档http://www.cnblogs.com/51kata/p/5152400.html(感觉说的挺简单明了的)

匹配规则大概有四种,这个见今日收获。

配置文件我现在接触的就是一上两点 ,以后再碰见再说。


【Spring-mvc的文件配置】


这个目前接受的比较简单。

1,将controller层注入,这个就不解释了,spring简单的注入。

2,对模型视图添加前后缀。这块还是没理解,


【三,controller文件】

package com.xiuzhen.controller;

import com.xiuzhen.model.Student;
import com.xiuzhen.service.StudentService;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;


/**
* Created by ${MIND-ZR} on 2017/10/20.
*/
@Controller
public class StudentController {

@Resource
   private StudentService studentService;

       @RequestMapping("/")
public ModelAndView getIndex() {
ModelAndView mav = new ModelAndView("index");
       Student student = studentService.selectStudentById(8);
       mav.addObject("student", student);

       mav.setViewName("/WEB-INF/view/index.jsp");
       return mav;
   }
}

这个就没什么需要理解的了。

重点是,ModelAndView

View: 我们要专门有一个模块,还存放所有的UI组件库, 按钮,图片,文本框,列表,菜单等等,这些东西都是死的,没有内容。 比方说文本框,你从组库中把文本框拿出来,默认里面没有任何文字。

Model: 我们的数据模型,如果是面向对象的程序,那就是一个个的数据类。如学生,老师,汽车,职员等等。他们也可以理解成数据结构。我们必须有一个专门的模块来存放这些结构。 结构也是死的,如果没有把他拿出来用,他就永远躺上该模块中。

Control: 控制者, 可以理解成一段代码, 它会根据当前的程序状态机,将合适的数据模型中的数据填充到UI视图中。也可以反过来通过监听UI组件的变化,将一部分变化写回数据模型中。

另外

这里是两个路径。

这个容易混,怎么区分理解呢

一个是RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

一个是视图解析器。


那么我在运行一次我的web程序的时候经历了什么呢!

我自己理了一下。


首先我的tomcat启动了。

                   

第一件事去找我的web.xml文件。

                    
在我的XML文件里面找到servlet。

                   

在我的serlvet里面找到我的SpringMVC配置文件。

                   

我在这个文件里面配了一个包扫描。

                   

他就会去找包扫描里面的我有Controller注解的类。加载到内存里了。

      


                   

当用户使用stu的请求的时候。他在扫Controller类的时候看看有没有stu名字的类。找到就开始访问。

                   

然后程序开始做第一件事。将我的

ModelAndView mav = new ModelAndView("index");

将我的数据放到 ModelAndView之中。

                                         ↓

并指定我要返回的页面。

                                         ↓


这个时候回到我最开始的灵魂作图。觉得最开始的逻辑吻合。稳得一匹


收获

<url-pattern>匹配规则到底有几种呢?

一、精确匹配

<url-pattern>中配置的项必须与url完全精确匹配。

如配置信息如下:

<servlet-mapping> 

       <servlet-name>MyServlet</servlet-name>

            <url-pattern>/kata/detail.html</url-pattern> 

       <url-pattern>/demo.html</url-pattern>

       <url-pattern>/table</url-pattern>

</servlet-mapping>


当在浏览器中输入如下几种url时,都会被匹配到该servlet

http://10.43.11.143/myapp/kata/detail.html
http://10.43.11.143/myapp/demo.html
http://10.43.11.143/myapp/table

注意:

http://10.43.11.143/myapp/table/ 是非法的url,不会被当作http://10.43.11.143/myapp/table识别

另外上述url后面可以跟任意的查询条件,都会被匹配,如

http://10.43.11.143/myapp/table?hello 这个请求就会被匹配到MyServlet。

三、扩展名匹配

如果匹配规则如下

<servlet-mapping> 

     <servlet-name>MyServlet</servlet-name> 

     <url-pattern>*.jsp</url-pattern>

</servlet-mapping>


则任何扩展名为jsp(文件名和路径任意)的url请求都会匹配,比如下面的url都会被匹配

http://10.43.11.143/myapp/demo.jsp
http://10.43.11.143/myapp/test.jsp

四,路径匹配

如果匹配规则如下

<servlet-mapping>

<servlet-name>MyServlet</servlet-name> 

     <url-pattern>/kata/*</url-pattern>

</servlet-mapping>

则请求的ulr只要前面(myapp之后)的路径是/kata,而后面的路径可以任意。比如下面的url都会被匹配。
http://10.43.11.143/myapp/kata/demo.html
http://10.43.11.143/myapp/kata/test.jsp
http://10.43.11.143/myapp/kata/test/detail.html

http://10.43.11.143/myapp/kata/action

http://10.43.11.143/myapp/kata/action/

注意:路径和扩展名匹配无法同时设置,比如下面的三个<url-pattern>都是非法的,如果设置,启动tomcat服务器会报错。

<url-pattern>/kata/*.jsp</url-pattern>

<url-pattern>/*.jsp</url-pattern>

<url-pattern>he*.jsp</url-pattern>

另外注意:<url-pattern>/aa/*/bb</url-pattern>
这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义


五、匹配任意的url

如果<url-pattern>配置成如下两种的任意一种

<url-pattern>/</url-pattern>

<url-pattern>/*</url-pattern>

则所有的url都可以被匹配上。其中/*是路径匹配,只是路径就是/。我这里采用的就是这种匹配方式

 

六、优先顺序

当一个url与多个servlet的匹配规则可以匹配时,则按照 “ 精确路径 > 最长路径>扩展名”这样的优先级匹配到对应的servlet。举例如下:

例1:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。

例2:比如servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。 

例3: 比如servletA的url-pattern:*.action ,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB。

遇到的问题

码代发现,上面这一段注释了我也能在页面上显示学生信息,这个路径是用来干嘛的,应该将我的视图解析指定到我特定的JSP上,就是说我以后JSP可能有很多个,这个对应过去,那我注释掉JSP应该就不会显示啊。还是说只有一个的情况下,我不设置输出的jsp,他也能找到?

不懂,明天再建一个JSP试试。

明天的计划

当然是接着啃任务二呀~




返回列表 返回列表
评论

    分享到