springmvc入门程序
一.需求分析
二.数据库环境
1.创建数据库
2.设计表
3.建表
三.java环境
1.jdk版本
2.开发环境
3.jar包
4.框架技术
四.配置前端控制器DispatcherServlet
1.在我们的web.xml中,配置前端控制器,配法跟以前是一样的,不过要注意的是还得配一个init-param元素,提供一对参数,参数名为contextConfigLocation,参数值为springmvc的主配置文件的类路径;也顺便说下,springmvc主配置文件有啥用,我们的前端控制器是需要是映射器和适配器等帮它完成相应的工作,所以必须得知道他们的位置在哪,没错,映射器和适配器等是在我们的springmvc.xml文件配置
<servlet>
<servlet-name>springmvc</servlet-name>
<!-- 前端控制器DispatcherServlet -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定sringmvc主配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果没有指定springmvc.xml的位置,默认:
2.讲解下url-pattern配置方案:
> *.action:表示访问的资源名后缀为.action将被我们的前端控制器所拦截
> / :代表拦截所有除了jsp外,不过像一些图片静态页面啥的静态文件是没必要拦截且拦截了之后也解析不了这种静态资源找到handler,所以在需要配置前端控制器不拦截静态资源或解析静态资源
> /* :该表示真的拦截所有,统统不放过,这个是不提倡使用的,比如说它会拦截jsp,前端控制器根据jsp的路径是找不到handler处理的,所以我们得避免这种情况
五.在springmvc主配置文件中配置
1.创建文件springmvc.xml后,得导一些约束,如图:
2.配置处理器适配器
<!-- 简单控制的处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
配置完后,怎么知道该类是适配器呢?所有的处理器适配器都实现了一个接口:HandlerAdapter
之前我们说过处理器得由适配器的要求来做,具体是怎么要求,下面看上述适配器的源代码:
每一个适配器都有supprots方法表示该适配器能支持哪种类型的处理器,比如上面的适配器,只要类实现了Controller接口,这个类就是该适配器能执行的处理器
3.配置处理器映射器
<!-- 把bean的name属性当作url来进行映射,这个beanName就是Handler的beanName --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
4.配置处理器
根据适配器的要求,我们先创建处理器,并书写测试代码即可
public class ItemsController1 implements Controller { public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { String data = "ItemsController1"; ModelAndView mav = new ModelAndView(); //相对于request.setAttribute() mav.addObject("data",data); //设置视图的路径名 mav.setViewName("/WEB-INF/jsp/index.jsp"); return mav; } }
Handler在配置时,beanName的值得时url形式的
<!-- 将/queryItems.action作为访问handler的url --> <bean name="/queryItems.action" class="cn.itheima.controller.ItemsController1"></bean>
5.配置视图解析器
<!-- 解析jsp路径,默认使用jstl进行解析,classpath得有jstl的包 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
六.非注解的映射器和适配器
1.非注解的映射器
(1)BeanNameUrlHandlerMapping,我们可以把handler的beanName书写成url的形式,该映射器可以映射找到
<!-- 把bean的name属性当作url来进行映射,这个beanName就是Handler的beanName --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
(2)SimpleUrlHandlerMapping,它是通过在内部一个集合中配置键值对的方式,将url映射到对应的handler的bean;键为Url,值为bean的id
<!-- 简单url处理器映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/queryItems2.action">itemsController1</prop> </props> </property> </bean>
<!-- 将/queryItems.action作为访问handler的url --> <bean id="itemsController1" name="/queryItems.action" class="cn.itheima.controller.ItemsController1"></bean>
多个映射器是可以并存的,前端控制器判断url来选择让哪个映射器处理
所有的映射器都实现了HandlerMapping接口
2.非注解的适配器
(1)SimpleControllerHandlerAdapter,它是要求我们的handler实现Controller接口
<!-- 简单控制的处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
(2)HttpRequestHandlerAdapter,它要求handler实现HttpRequestHandler接口
<!-- httqRequest适配器 --> <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
现在创建一个HttpRequestHandler接口的处理器并书写测试代码
public class ItemsController2 implements HttpRequestHandler { public void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String data = "ItemsController2"; //保存数据到request域 req.setAttribute("data",data); //转发 req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp); } }
在这里我做一个小结:
>实现了Controller接口和HttpRequestHandler接口的handler有一个缺点,handler只有一个方法;我们通过url映射到handler类,默认执行这个方法,若一个类中需要写增删改的方法的话,非注解的适配器的要求是不合理的;
>实现了HttpRequestHandler,方法里面的代码比较原生,还是利用之前的request机制来处理,可以修改response响应的数据格式等,比如json格式,这是实现controller接口的handler做不到的
>非注解的适配器和映射器是没有硬性要求配对使用的
>handler的创建和配置得考虑它的映射器和适配器,适配器执行handler,映射器是寻找handler
七.注解的映射器和适配器
在讲前给大家说一个配置文件:
如果你没有配置映射器,适配器,解析器等,默认去加载该配置文件的组件,它的默认非注解适配器,映射器等没啥毛病,但是默认的注解适配器和映射器我得说一下
上面两个在3.1之前使用的,现在已经过时了,3.1后有新的代替:
>3.1后使用的注解映射器:
<!-- 注解映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
>3.1后使用的注解适配器:
<!-- 注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
介绍一个标签<mvc:annotation-driven/>可以代替上述的注解映射器和适配器,除此之外,它还加载了很多参数绑定的方法,比如json的转换解析器默认加载了,实际开发中用此方式更多
正式开始使用注解开发Handler
1.RequestMappingHandlerAdapter,要求handler类上加@Controller,表示该类是它能处理的handler
2.RequestMappingHandlerMapping,它是讲url映射到handler方法上,跟非注解的非常大的不一样,非注解是url跟类进行映射的,方法只有一个;而它是可以在handler中多个方法上进行url映射的,方法的命名是任意的
@Controller public class ItemsController3 { @RequestMapping("/handleRequest") public void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String data = "ItemsController3"; //保存数据到request域 req.setAttribute("data",data); //转发 req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp); } }
url的路径建议是跟方法名一致的;得注意一个问题,如果你前端控制器只拦截*.action,比如你访问/handRequest是访问不到的,你得访问的是/handRequest.action,才可以找得到 @RequestMapping("/handleRequest")的对应方法
小结:》注解的映射器和适配器必须配套使用,不能使用注解的映射器和非注解的适配器等情况
》注解的映射器可以对@Controller类中标有@ResourceMapping的方法进行映射,省掉了在xml中配置url映射到handler的关系
八.视图解析器前缀和后缀
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~