Maison > Java > javaDidacticiel > Apprentissage approfondi et construction de Spring+SpringMVC+MyBatis - Programme d'entrée SpringMVC (2)

Apprentissage approfondi et construction de Spring+SpringMVC+MyBatis - Programme d'entrée SpringMVC (2)

巴扎黑
Libérer: 2017-06-26 11:12:12
original
1597 Les gens l'ont consulté

Veuillez indiquer la source de la réimpression :

Comme mentionné précédemment : Spring+SpringMVC+MyBatis apprentissage et construction approfondis (12) - Programme d'entrée SpringMVC (1)

1. -annotation Mappeurs et adaptateurs de processeur

1.1 Mappeur de processeur non annoté

Le org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping que nous avons configuré précédemment est un mappeur de processeur non annoté. En fait, un problème avec ce type de mappeur est qu'une url doit être configurée dans un bean.

Maintenant, nous configurons un autre mappeur sans annotation

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping, qui configurera l'URL et le gestionnaire de manière centralisée.

    <!-- 配置Handler --><bean id="ItemsController1" name="/queryItems.action" class="joanna.yan.ssm.controller.ItemsController1"/><!-- 配置处理器映射器 
         将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 简单url映射
         simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版,
                  它可以将url和处理器bean的id进行统一映射配置。      -->  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><!-- 对ItemsController1进行url映射,url是/queryItems1.action  --><prop key="/queryItems1.action">ItemsController1</prop><prop key="/queryItems2.action">ItemsController1</prop></props></property></bean>
Copier après la connexion

Question : Ces deux mappeurs peuvent-ils être configurés en même temps ?

Réponse : plusieurs mappeurs peuvent coexister. Le contrôleur frontal détermine quels mappeurs l'URL peut mapper et laisse le mappeur approprié le gérer.

1.2 Adaptateur de processeur non annoté

L'org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter que nous avons configuré précédemment est un adaptateur non annoté. Cela nécessite que le gestionnaire que vous écrivez implémente l’interface du contrôleur.

Parlons d'un autre adaptateur non annoté :

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter. Cela nécessite que le gestionnaire écrit implémente l'interface HttpRequestHandler.

public class ItemsController2 implements HttpRequestHandler{

    @Overridepublic void handleRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//调用service查找数据库,查询商品列表,这里使用静态数据模拟List<Items> itemsList=new ArrayList<Items>();
        Items items_1=new Items();
        items_1.setName("联想笔记本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
        
        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6苹果手机!");
        
        itemsList.add(items_1);
        itemsList.add(items_2);//设置模型数据request.setAttribute("itemsList", itemsList);//设置转发的视图request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);        
//        从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响应内容,比如返回json数据://        response.setCharacterEncoding("utf-8");//        response.setContentType("application/json;charset=utf-8");//        response.getWriter().write("json串");    }
}
Copier après la connexion

Configuré dans springmvc.xml :

2.Propriétés DispatcherServlet.

Le contrôleur frontal charge les mappeurs de traitement, les adaptateurs, les analyseurs de vues et d'autres composants à partir des fichiers ci-dessus. S'il n'est pas configuré dans springmvc.xml, il utilisera le. ceux chargés par défaut.

3. Mappeurs et adaptateurs de processeur annotés

Utilisez le mappeur d'annotations org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping avant spring3.1.

Utilisez le mappeur d'annotations org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping après spring3.1.

Utilisez l'adaptateur d'annotation org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter avant spring3.1.

Utilisez l'adaptateur d'annotation org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter après spring3.1.

3.1 Configurer les mappeurs et les adaptateurs d'annotations

    <!--注解映射器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/><!--注解适配器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/><!--使用mvc:annotation-driven代替上边注解映射器和注解适配器 配置
        mvc:annotation-driven默认加载很多的参数绑定方法,
        比如json转换解析器就默认加载了,如果使用mvc:annotation-driven就不用配置上面的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
        实际开发时使用mvc:annotation-driven     --><!-- <mvc:annotation-driven></mvc:annotation-driven> -->
Copier après la connexion

3.2 Développer des gestionnaires d'annotations

Utiliser des mappeurs annotés et des adaptateurs annotés. (Les mappeurs annotés et les adaptateurs annotés doivent être utilisés par paires. Il est entendu que les mappeurs non annotés ne peuvent pas être utilisés pour le mappage)

/**
 * 开发注解Handler
 * 使用@Controller标明它是一个控制器
 * @author Joanna.Yan
 * 
 */@Controllerpublic class ItemsController3{    //商品查询列表//@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url//一般建议将url和方法名写成一样,方便维护@RequestMapping("/queryItems")public ModelAndView queryItems() throws Exception{//调用service查找数据库,查询商品列表,这里使用静态数据模拟List<Items> itemsList=new ArrayList<Items>();
        Items items_1=new Items();
        items_1.setName("联想笔记本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
        
        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6苹果手机!");
        
        itemsList.add(items_1);
        itemsList.add(items_2);//返回ModelAndViewModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("itemsList", itemsList);//指定视图modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");return modelAndView;
    }//定义其它方法//商品添加//商品修改}
Copier après la connexion

3.3 Chargement du gestionnaire dans le conteneur Spring

    <!-- 对于注解的Handler可以单个配置
         实际开发中建议使用组件扫描     --><!-- <bean class="joanna.yan.ssm.controller.ItemsController3" /> --><!-- 可以扫描controller、service、...
         这里让扫描controller,指定controller的包      --><context:component-scan base-package="joanna.yan.ssm.controller"></context:component-scan>
Copier après la connexion

Utilisez le scanner de composants pour éviter la fastidité de la configuration de chaque classe de contrôleur dans le conteneur Spring. Utilisez pour analyser automatiquement les classes de contrôle marquées @Controller.

3.4 Déploiement et débogage

Visite : http://localhost:8080/SpringMVC/jyqueryItems.action

Remarque : configuration unique pendant les tests Là Il n'y a aucun problème avec l'exécution du gestionnaire annoté. Lors de la configuration du scanner de composants pour qu'il s'exécute, un message d'erreur apparaît au démarrage de Tomcat :

<.>
严重: Context initialization failed
java.lang.IllegalArgumentException
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5266)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5554)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1258)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1918)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
六月 14, 2017 4:43:03 下午 org.apache.catalina.core.ApplicationContext log
严重: StandardWrapper.Throwable
java.lang.IllegalArgumentException
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5266)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5554)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1258)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1918)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
六月 14, 2017 4:43:03 下午 org.apache.catalina.core.StandardContext loadOnStartup
严重: Servlet [springmvc] in web application [/SpringMVC] threw load() exception
java.lang.IllegalArgumentException
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
    at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5266)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5554)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1258)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1918)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Copier après la connexion
Voir le code

 

原因是:我的Tomcat的jdk是1.8,项目的jdk版本是1.7,两者不一样造成的。记得要统一版本!

4.前端控制器源码分析

通过前端控制器源码分析springmvc的执行过程。

 第一步:前端控制器接收请求

调用doDispatch

 第二步:前端控制器调用处理器映射器查找Handler

 

第三步:调用处理器适配器执行Handler,得到执行结果ModeAndView

第四步:视图渲染,将model数据填充到request域。

视图解析,得到view:

调用view的渲染方法,将model数据填充到request域。

渲染方法:

5.视图解析器配置前缀和后缀

springmvc.xml中:

    <!-- 配置视图解析器 
         解析jsp视图,默认使用jstl标签,所有classpath下得有jstl的包--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置jsp路径的前缀  --><property name="prefix" value="/WEB-INF/jsp/"/><!--配置jsp路径的后缀  --><property name="suffix" value=".jsp"/></bean>
Copier après la connexion

程序中不用指定前缀和后缀:

        //指定视图//        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");//下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为modelAndView.setViewName("items/itemsList");
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal