Qing пре 1 година
родитељ
комит
0a32eed740

+ 43 - 9
springmvc-demo/.idea/workspace.xml

@@ -10,11 +10,16 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="d55c211f-cca4-4230-b149-ae8c1dab3c43" name="Changes" comment="0118 ssm整合">
+    <list default="true" id="d55c211f-cca4-4230-b149-ae8c1dab3c43" name="Changes" comment="0118 springmvc示例">
       <change afterPath="$PROJECT_DIR$/../.idea/VIPJAVA.iml" afterDir="false" />
       <change afterPath="$PROJECT_DIR$/../gn_oa_vip27/.idea/google-java-format.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/controller/HttpController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/test/java/com/sf/TestSpringMvc.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/WebInitConfig.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/DruidConfig.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/MybatisConfig.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/SpringConfig.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/log4j.properties" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/templates/hello.html" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/templates/test.html" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/java/com/lc/mapper/UserMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/java/com/lc/mapper/UserMapper.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../02_JavaWeb/day06_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../02_JavaWeb/day07_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../02_JavaWeb/day07_mybatis/src/main/resources/com/lc/mapper/UserMapper.xml" afterDir="false" />
@@ -24,7 +29,16 @@
       <change beforePath="$PROJECT_DIR$/../gn_oa_vip27/src/main/java/com/sf/utils/JdbcUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/../gn_oa_vip27/src/main/java/com/sf/utils/JdbcUtil.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/entity/Author.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/entity/Author.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/anno/MyServletContainerInitializer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/init/MyServletContainerInitializer.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/anno/MyWebAppInitializer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/init/MyWebAppInitializer.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/anno/SpringMvcConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/SpringMvcConfig.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/controller/AuthorController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/controller/AuthorController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/controller/HelloController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/controller/HelloController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/controller/HttpController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/controller/HttpController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/spring-mvc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/spring-mvc.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/webapp/WEB-INF/web.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/web.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/webapp/hello.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/jsp/hello.jsp" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/webapp/index.jsp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/webapp/WEB-INF/jsp/index.jsp" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -43,6 +57,9 @@
         <option value="Spring Xml File" />
         <option value="Interface" />
         <option value="Mybatis Mapper Xml File" />
+        <option value="Properties File" />
+        <option value="Thymeleaf HTML File" />
+        <option value="HTML File" />
         <option value="Class" />
       </list>
     </option>
@@ -72,6 +89,7 @@
   </component>
   <component name="PropertiesComponent"><![CDATA[{
   "keyToString": {
+    "DefaultHtmlFileTemplate": "HTML File",
     "HTTP Request.rest-api_1 | #1.executor": "Run",
     "JUnit.TestSpringMvc.test.executor": "Run",
     "Maven. [org.apache.maven.plugins:maven-archetype-plugin:RELEASE:generate].executor": "Run",
@@ -81,13 +99,13 @@
     "Tomcat Server.Tomcat 8.5.93.executor": "Run",
     "git-widget-placeholder": "master",
     "kotlin-language-version-configured": "true",
-    "last_opened_file_path": "/Users/Qing/IdeaProjects/SiFu/VIPJAVA/springmvc-demo/src/main/java/com/sf",
+    "last_opened_file_path": "/Users/Qing/IdeaProjects/SiFu/VIPJAVA/springmvc-demo",
     "node.js.detected.package.eslint": "true",
     "node.js.detected.package.tslint": "true",
     "node.js.selected.package.eslint": "(autodetect)",
     "node.js.selected.package.tslint": "(autodetect)",
     "nodejs_package_manager_path": "npm",
-    "project.structure.last.edited": "Modules",
+    "project.structure.last.edited": "Artifacts",
     "project.structure.proportion": "0.17833698",
     "project.structure.side.proportion": "0.2150838",
     "settings.editor.selected.configurable": "preferences.pluginManager",
@@ -101,8 +119,13 @@
       <recent name="$PROJECT_DIR$/src/main/webapp/WEB-INF" />
     </key>
     <key name="MoveFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/src/main/java/com/sf/anno/init" />
+      <recent name="$PROJECT_DIR$/src/main/webapp/WEB-INF/jsp" />
       <recent name="$PROJECT_DIR$/src/main/java/com/sf/anno" />
     </key>
+    <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.sf.anno" />
+    </key>
   </component>
   <component name="RunManager" selected="Tomcat Server.Tomcat 10.0.21">
     <configuration name="rest-api_1 | #1" type="HttpClient.HttpRequestRunConfigurationType" factoryName="HTTP Request" temporary="true" nameIsGenerated="true" path="$APPLICATION_CONFIG_DIR$/scratches/rest-api_1.http" requestIdentifier="#1" runType="Run single request">
@@ -234,7 +257,9 @@
       <option name="presentableId" value="Default" />
       <updated>1705471907664</updated>
       <workItem from="1705471908780" duration="12452000" />
-      <workItem from="1705492873471" duration="16210000" />
+      <workItem from="1705492873471" duration="19225000" />
+      <workItem from="1705593304178" duration="747000" />
+      <workItem from="1705625830502" duration="9118000" />
     </task>
     <task id="LOCAL-00001" summary="0117 springmvc">
       <option name="closed" value="true" />
@@ -252,7 +277,15 @@
       <option name="project" value="LOCAL" />
       <updated>1705551875551</updated>
     </task>
-    <option name="localTasksCounter" value="3" />
+    <task id="LOCAL-00003" summary="0118 springmvc示例">
+      <option name="closed" value="true" />
+      <created>1705569024785</created>
+      <option name="number" value="00003" />
+      <option name="presentableId" value="LOCAL-00003" />
+      <option name="project" value="LOCAL" />
+      <updated>1705569024785</updated>
+    </task>
+    <option name="localTasksCounter" value="4" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -297,7 +330,8 @@
   <component name="VcsManagerConfiguration">
     <MESSAGE value="0117 springmvc" />
     <MESSAGE value="0118 ssm整合" />
-    <option name="LAST_COMMIT_MESSAGE" value="0118 ssm整合" />
+    <MESSAGE value="0118 springmvc示例" />
+    <option name="LAST_COMMIT_MESSAGE" value="0118 springmvc示例" />
   </component>
   <component name="XSLT-Support.FileAssociations.UIState">
     <expand />

+ 23 - 0
springmvc-demo/pom.xml

@@ -119,6 +119,29 @@
             <version>3.0.3</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>2.0.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.thymeleaf</groupId>
+            <artifactId>thymeleaf-spring6</artifactId>
+            <version>3.1.2.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.thymeleaf</groupId>
+            <artifactId>thymeleaf</artifactId>
+            <version>3.1.2.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.16.0</version>
+        </dependency>
+
     </dependencies>
     <build>
         <finalName>springmvc-demo</finalName>

+ 42 - 0
springmvc-demo/src/main/java/com/sf/WebInitConfig.java

@@ -0,0 +1,42 @@
+package com.sf;
+
+import com.sf.anno.SpringConfig;
+import com.sf.anno.SpringMvcConfig;
+import jakarta.servlet.Filter;
+import org.springframework.web.filter.CharacterEncodingFilter;
+import org.springframework.web.filter.HiddenHttpMethodFilter;
+import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
+
+// web 工程的初始化类,用来代替web.xml
+//@Configuration
+public class WebInitConfig
+        extends AbstractAnnotationConfigDispatcherServletInitializer {
+
+    // 指定spring的配置类
+    @Override
+    protected Class<?>[] getRootConfigClasses() {
+        return new Class[]{SpringConfig.class};
+    }
+
+    // 指定springMVC的配置类
+    @Override
+    protected Class<?>[] getServletConfigClasses() {
+        return new Class[]{SpringMvcConfig.class};
+    }
+
+    // 指定DispatcherServlet映射规则,及url-pattern
+    @Override
+    protected String[] getServletMappings() {
+        return new String[]{"/"};
+    }
+
+    // 注册过滤器
+    @Override
+    protected Filter[] getServletFilters() {
+        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
+        characterEncodingFilter.setEncoding("utf-8");
+        characterEncodingFilter.setForceRequestEncoding(true);
+        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
+        return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
+    }
+}

+ 42 - 0
springmvc-demo/src/main/java/com/sf/anno/DruidConfig.java

@@ -0,0 +1,42 @@
+package com.sf.anno;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import javax.sql.DataSource;
+
+@PropertySource("classpath:db.properties")
+public class DruidConfig {
+
+    @Value("${jdbc.url}")
+    private String url;
+
+    @Value("${jdbc.driver}")
+    private String driver;
+
+    @Value("${jdbc.username}")
+    private String username;
+
+    @Value("${jdbc.password}")
+    private String password;
+
+    @Bean(name = "dataSource")
+    public DataSource createDataSource(){
+        DruidDataSource dataSource = new DruidDataSource();
+        dataSource.setDriverClassName(driver);
+        dataSource.setUrl(url);
+        dataSource.setUsername(username);
+        dataSource.setPassword(password);
+        return dataSource;
+    }
+
+    // 新的bean  jdbcTemplate 使用jdbc的模版类
+//    @Bean(name = "jdbcTemplate")
+//    public JdbcTemplate createJdbcTemplate(DataSource dataSource) {
+//        return new JdbcTemplate(dataSource);
+//    }
+
+}

+ 60 - 0
springmvc-demo/src/main/java/com/sf/anno/MybatisConfig.java

@@ -0,0 +1,60 @@
+package com.sf.anno;
+
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.mybatis.spring.mapper.MapperScannerConfigurer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.*;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
+
+//@MapperScan("com.sf.dao")//MyBatis扫描dao接口
+//@Import(DruidConfig.class)
+public class MybatisConfig {
+
+    //创建SqlSessionFactoryBean对象,设置形参,Spring会自动去调用IOC容器中已有的数据源
+    @Bean
+    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean sqlSessionFactoryBean
+                = new SqlSessionFactoryBean();
+        sqlSessionFactoryBean.setDataSource(dataSource);
+        sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
+        //加载映射文件,文件目录为resources下面
+        ResourcePatternResolver resourcePatternResolver =
+                new PathMatchingResourcePatternResolver();
+        //读取以Mapper结尾的映射文件
+        Resource[] mapperLocationResource = resourcePatternResolver
+                .getResources("classpath*:mapper/**/*.xml");
+        sqlSessionFactoryBean.setMapperLocations(mapperLocationResource);
+        return sqlSessionFactoryBean;
+    }
+
+    @Bean
+    public MapperScannerConfigurer mapperScannerConfigurer() {
+        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
+        //定义接口位置
+        configurer.setBasePackage("com.sf.dao");
+        //需要由SqlSessionFactoryBean创建的SqlSession
+        configurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
+        //如果不同的包中出现了相同的接口,那么必须给捷库设置别名
+//        configurer.setAnnotationClass(Repository.class);//接口上必须定义该注解
+        return configurer;
+    }
+
+    @Bean
+    public PlatformTransactionManager getTransactionManager(
+            @Autowired DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+}

+ 14 - 0
springmvc-demo/src/main/java/com/sf/anno/SpringConfig.java

@@ -0,0 +1,14 @@
+package com.sf.anno;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@ComponentScan("com.sf.service")
+@EnableTransactionManagement
+@Import({DruidConfig.class,MybatisConfig.class})
+public class SpringConfig {
+
+}

+ 46 - 5
springmvc-demo/src/main/java/com/sf/anno/SpringMvcConfig.java

@@ -3,13 +3,54 @@ package com.sf.anno;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.servlet.ViewResolver;
+import org.thymeleaf.spring6.SpringTemplateEngine;
+import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
+import org.thymeleaf.spring6.view.ThymeleafViewResolver;
+import org.thymeleaf.templatemode.TemplateMode;
+import org.thymeleaf.templateresolver.ITemplateResolver;
 
-/**
- * @EnableWebMvc 代表打开对springmvc的使用
- */
-@EnableWebMvc
+// 当前类用来代替springMVC配置文件
+// 将当前类标识为一个配置类
 @Configuration
-@ComponentScan
+// 扫描组件
+@ComponentScan("com.sf.controller")
+// mvc注解驱动
+@EnableWebMvc
 public class SpringMvcConfig {
+    // 扫描组件
+    // 视图解析器
+    @Bean
+    public ITemplateResolver templateResolver() {
+        SpringResourceTemplateResolver templateResolver = new
+                SpringResourceTemplateResolver();
+        // 前缀 代表视图文件对应的地址
+        templateResolver.setPrefix("/WEB-INF/templates/");
+        // 后缀 代表视图对应的文件扩展名
+        //   只需要视图文件本身的名字 比如hello
+        //   就可以拼接出  /WEB-INF/templates/hello.html
+        templateResolver.setSuffix(".html");
+        templateResolver.setCharacterEncoding("utf-8");
+        templateResolver.setTemplateMode(TemplateMode.HTML);
+        templateResolver.setCacheable(false);
+        return templateResolver;
+    }
+
+    // 生成模板引擎并为模板引擎注入模板解析器
+    @Bean
+    public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
+        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
+        templateEngine.setTemplateResolver(templateResolver);
+        return templateEngine;
+    }
 
+    // 生成视图解析器并为解析器注入模板引擎
+    @Bean
+    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
+        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
+        viewResolver.setCharacterEncoding("utf-8");
+        viewResolver.setTemplateEngine(templateEngine);
+        return viewResolver;
+    }
 }

+ 1 - 1
springmvc-demo/src/main/java/com/sf/anno/MyServletContainerInitializer.java → springmvc-demo/src/main/java/com/sf/anno/init/MyServletContainerInitializer.java

@@ -1,4 +1,4 @@
-package com.sf.anno;
+package com.sf.anno.init;
 
 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

+ 1 - 1
springmvc-demo/src/main/java/com/sf/anno/MyWebAppInitializer.java → springmvc-demo/src/main/java/com/sf/anno/init/MyWebAppInitializer.java

@@ -1,4 +1,4 @@
-package com.sf.anno;
+package com.sf.anno.init;
 
 import jakarta.servlet.ServletContext;
 import jakarta.servlet.ServletException;

+ 8 - 0
springmvc-demo/src/main/java/com/sf/controller/AuthorController.java

@@ -1,5 +1,6 @@
 package com.sf.controller;
 
+import com.sf.entity.Author;
 import com.sf.service.AuthorService;
 import com.sf.service.BookService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -7,6 +8,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * @RestController 是Controller中的一种
  * 在不需要返回页面 只需要返回数据的时候  可以被使用
@@ -25,4 +28,9 @@ public class AuthorController {
 //        return "刘慈欣 李刚 路遥";
         return authorService.queryAuthors().toString();
     }
+
+    @GetMapping("/author/list")
+    public List<Author> getAuthorList() {
+        return authorService.queryAuthors();
+    }
 }

+ 34 - 4
springmvc-demo/src/main/java/com/sf/controller/HelloController.java

@@ -1,16 +1,46 @@
 package com.sf.controller;
 
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
 
 @Controller
+//@RestController
+//@RequestMapping("/hello")
 public class HelloController {
 
+//    @RequestMapping("/hello")
+//    public ModelAndView hello(){
+//        ModelAndView modelAndView = new ModelAndView();
+//        modelAndView.setViewName("/index.jsp");
+//        return modelAndView;
+//    }
+
+
+    //    @RequestMapping("")
     @RequestMapping("/hello")
-    public ModelAndView hello(){
-        ModelAndView modelAndView = new ModelAndView();
-        modelAndView.setViewName("/index.jsp");
-        return modelAndView;
+    public String hello(Model model) {
+        model.addAttribute("name", "Thymeleaf");
+        return "hello";
     }
+
+    // http://localhost:8080/springmvc_demo/testForward
+    @RequestMapping("/testForward")
+    public String testForward() {
+        return "forward:/testThymeleaf";
+    }
+
+    @RequestMapping("/testThymeleaf")
+    public String testThymeleaf() {
+        return "test";
+    }
+
+    // http://localhost:8080/springmvc_demo/testRedirect
+    @RequestMapping("/testRedirect")
+    public String testRedirect() {
+        return "redirect:/testThymeleaf";
+    }
+
 }

+ 8 - 0
springmvc-demo/src/main/java/com/sf/controller/HttpController.java

@@ -83,6 +83,14 @@ public class HttpController {
         return "hello PathVariable";
     }
 
+    // http://localhost:8080/springmvc_demo/http/register/test/中文
+//    @RequestMapping(value = "/register/name/{name}", method = RequestMethod.GET)
+    @RequestMapping(value = "/register/test/{name}", method = RequestMethod.GET)
+    public String testRegisterByName(@PathVariable("name") String name) {
+        System.out.println("name is " + name);
+        return "hello PathVariable by name";
+    }
+
     // http://localhost:8080/springmvc_demo/http/header
     @RequestMapping("/header")
     public String testHeader(@RequestHeader("user-agent") String UA,

+ 5 - 0
springmvc-demo/src/main/resources/log4j.properties

@@ -0,0 +1,5 @@
+log4j.rootLogger=DEBUG,A1
+log4j.logger.org.apache=DEBUG
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

+ 21 - 1
springmvc-demo/src/main/resources/spring-mvc.xml

@@ -2,8 +2,28 @@
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
-        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
+        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
     <!-- 扫描所有的后端控制器,创建对象到容器中 -->
     <context:component-scan base-package="com.sf.controller" />
+    <mvc:annotation-driven />
+
+    <bean id="templateResolver" class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
+        <property name="prefix" value="/WEB-INF/templates/" />
+        <property name="suffix" value=".html" />
+        <property name="templateMode" value="HTML" />
+        <property name="cacheable" value="false" />
+        <property name="characterEncoding" value="UTF-8"/>
+    </bean>
+
+    <bean id="templateEngine" class="org.thymeleaf.spring6.SpringTemplateEngine">
+        <property name="templateResolver" ref="templateResolver" />
+    </bean>
+
+    <!--    视图解析器-->
+    <bean id="viewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
+        <property name="templateEngine" ref="templateEngine" />
+        <property name="characterEncoding" value="UTF-8"/>
+    </bean>
 </beans>

+ 0 - 0
springmvc-demo/src/main/webapp/hello.jsp → springmvc-demo/src/main/webapp/WEB-INF/jsp/hello.jsp


+ 0 - 0
springmvc-demo/src/main/webapp/index.jsp → springmvc-demo/src/main/webapp/WEB-INF/jsp/index.jsp


+ 12 - 0
springmvc-demo/src/main/webapp/WEB-INF/templates/hello.html

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+  <meta charset="UTF-8">
+  <title>Title</title>
+</head>
+<body>
+Hello,
+<p th:text="${name}">name</p>
+<!--<p th:utext="${name}" >name</p>-->
+</body>
+</html>

+ 10 - 0
springmvc-demo/src/main/webapp/WEB-INF/templates/test.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Test</title>
+</head>
+<body>
+TEST
+</body>
+</html>

+ 57 - 57
springmvc-demo/src/main/webapp/WEB-INF/web.xml

@@ -1,74 +1,74 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--<web-app></web-app>-->
-<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
-                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
-         version="5.0">
-
-<!--<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"-->
+<web-app></web-app>
+<!--<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"-->
 <!--         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"-->
-<!--         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee-->
-<!--                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"-->
-<!--         version="3.1">-->
+<!--         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee-->
+<!--                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"-->
+<!--         version="5.0">-->
+
+<!--&lt;!&ndash;<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"&ndash;&gt;-->
+<!--&lt;!&ndash;         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&ndash;&gt;-->
+<!--&lt;!&ndash;         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee&ndash;&gt;-->
+<!--&lt;!&ndash;                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"&ndash;&gt;-->
+<!--&lt;!&ndash;         version="3.1">&ndash;&gt;-->
+
+<!--    <context-param>-->
+<!--        <param-name>contextConfigLocation</param-name>-->
+<!--        <param-value>classpath:spring.xml</param-value>-->
+<!--    </context-param>-->
+<!--    <listener>-->
+<!--        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>-->
+<!--    </listener>-->
 
-    <context-param>
-        <param-name>contextConfigLocation</param-name>
-        <param-value>classpath:spring.xml</param-value>
-    </context-param>
-    <listener>
-        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-    </listener>
+<!--    <servlet>-->
+<!--        <servlet-name>dispatcherServlet</servlet-name>-->
+<!--        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>-->
+<!--        &lt;!&ndash; 创建前端控制器的时候读取springmvc配置文件启动ioc容器 &ndash;&gt;-->
+<!--        <init-param>-->
+<!--            <param-name>contextConfigLocation</param-name>-->
+<!--            <param-value>classpath:spring-mvc.xml</param-value>-->
+<!--            &lt;!&ndash; <param-value>classpath:springmvc-annotation.xml</param-value> &ndash;&gt;-->
+<!--        </init-param>-->
+<!--        &lt;!&ndash; Tomcat启动就创建此对象 &ndash;&gt;-->
+<!--        <load-on-startup>1</load-on-startup>-->
+<!--    </servlet>-->
 
-    <servlet>
-        <servlet-name>dispatcherServlet</servlet-name>
-        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
-        <!-- 创建前端控制器的时候读取springmvc配置文件启动ioc容器 -->
-        <init-param>
-            <param-name>contextConfigLocation</param-name>
-            <param-value>classpath:spring-mvc.xml</param-value>
-            <!-- <param-value>classpath:springmvc-annotation.xml</param-value> -->
-        </init-param>
-        <!-- Tomcat启动就创建此对象 -->
-        <load-on-startup>1</load-on-startup>
-    </servlet>
+<!--    &lt;!&ndash;-->
+<!--    配置拦截路径url,所有请求都会被前端控制器拦截处理-->
+<!--    所匹配的请求可以是/login,或.html  或.js  或.css方式的请求路径-->
+<!--    但是,/不能匹配.jsp请求路径的请求-->
+<!--    &ndash;&gt;-->
+<!--    <servlet-mapping>-->
+<!--        <servlet-name>dispatcherServlet</servlet-name>-->
+<!--        <url-pattern>/</url-pattern>-->
+<!--    </servlet-mapping>-->
 
-    <!--
-    配置拦截路径url,所有请求都会被前端控制器拦截处理
-    所匹配的请求可以是/login,或.html  或.js  或.css方式的请求路径
-    但是,/不能匹配.jsp请求路径的请求
-    -->
-    <servlet-mapping>
-        <servlet-name>dispatcherServlet</servlet-name>
-        <url-pattern>/</url-pattern>
-    </servlet-mapping>
 
+<!--&lt;!&ndash;    <filter>&ndash;&gt;-->
+<!--&lt;!&ndash;        <filter-name>CharacterEncoding</filter-name>&ndash;&gt;-->
+<!--&lt;!&ndash;        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>&ndash;&gt;-->
+<!--&lt;!&ndash;        <init-param>&ndash;&gt;-->
+<!--&lt;!&ndash;            <param-name>encoding</param-name>&ndash;&gt;-->
+<!--&lt;!&ndash;            <param-value>utf-8</param-value>&ndash;&gt;-->
+<!--&lt;!&ndash;        </init-param>&ndash;&gt;-->
+<!--&lt;!&ndash;    </filter>&ndash;&gt;-->
+<!--&lt;!&ndash;    <filter-mapping>&ndash;&gt;-->
+<!--&lt;!&ndash;        <filter-name>CharacterEncoding</filter-name>&ndash;&gt;-->
+<!--&lt;!&ndash;        <url-pattern>/*</url-pattern>&ndash;&gt;-->
+<!--&lt;!&ndash;    </filter-mapping>&ndash;&gt;-->
 
+<!--    &lt;!&ndash;    解决中文乱码的过滤器&ndash;&gt;-->
 <!--    <filter>-->
-<!--        <filter-name>CharacterEncoding</filter-name>-->
+<!--        <filter-name>characterEncodingFilter</filter-name>-->
 <!--        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>-->
 <!--        <init-param>-->
 <!--            <param-name>encoding</param-name>-->
-<!--            <param-value>utf-8</param-value>-->
+<!--            <param-value>UTF-8</param-value>-->
 <!--        </init-param>-->
 <!--    </filter>-->
 <!--    <filter-mapping>-->
-<!--        <filter-name>CharacterEncoding</filter-name>-->
+<!--        <filter-name>characterEncodingFilter</filter-name>-->
 <!--        <url-pattern>/*</url-pattern>-->
 <!--    </filter-mapping>-->
 
-    <!--    解决中文乱码的过滤器-->
-    <filter>
-        <filter-name>characterEncodingFilter</filter-name>
-        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
-        <init-param>
-            <param-name>encoding</param-name>
-            <param-value>UTF-8</param-value>
-        </init-param>
-    </filter>
-    <filter-mapping>
-        <filter-name>characterEncodingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-
-</web-app>
+<!--</web-app>-->