springmvc就是一个库,他要依赖一大堆的库,并且版本很多,因此引入maven。导库,只需要书写依赖的坐标。以后需要库到mvnrepository.com找,找到之后将其贴到pom.xml中就好。jar包引入后还需要启动起来,springmvc的启动是通过一个超级servlet来完成的。它可以使任何请求都指向它。 原来是有请求servlet才启动做回应,现在只要web应用程序启动它就启动。一访问路径都是它。然后有一个初始化参数告诉它怎么工作。初始化参数指明的类路径下的dispatcher,指明了servlet应该怎么工作 。dispatcher-servlet的内容大致如下:
1`表明是注解驱动的,要去扫描注解了
2·告诉springmvc到哪里找。使用注解的话,说明是写在类上的,在类上要去找,并不是所有的类都是。为提高搜索效率,指明搜索位置。
3·任何的路径,都会被认为是控制器的访问路径。会被servlet拦截,到Controller去查,发现什么都没有,就404了。要告诉他那些东西是不是控制器路径。
4·在Controller中的方法的返回值都是字符串,如果在方法前写上“@ResponseBody”就是返回给我们的文字。如果没有“@ResponseBody”,就不会原样返回,会传给后台,然后台处理字符串,就是返回回来的视图的路径的构成的一部分。
让后台的处理器——视图解析器处理,它得到一个字符串,努力将他解析成一个路径。设定前缀和后缀,视图解析器会以前缀+传入字符串+后缀的方式拼接出一个网页路径。然后forward过去,就到达相应的界面上了。
运行:
访问/a:
访问/adfdf:
就会报错,因为它会将其当做控制器。
他说:针对这个地址,没有mapping被找到。
访问/student/input:
在springmvc的超级servlet眼中,所有的路径都是控制器路径,其会把所有的请求当做控制器路径来理解。去适配。只要一个请求到来,他就会去找控制器中的条目,一一的去适配。但是有些路径是一些文件,所以我们必须告诉springmvc哪些路径是可以豁免的,不要去强行解析。
现在要做的:收到数据,将其提交给Mybatis。
可以一部分使用springmvc,一部分保持servlet不变。可以慢慢转化,侵入性低。
新建包domain,将原来的domain的Student搬过来:
在Controller中,添加方法“createStudent”:
@PostMapping("/student/save")
public String createStudent(Student stu) throws Exception{
System.out.println(stu);
return null;
}
以post方法提交,提交网址为"/student/save",即以post方式访问这个路径的话,有这个方法来处理。
来到input_student.jsp,修改:
原来:
现在:
修改一下路径,确定提交方式是post。原来的task就不需要了。
原来输入控件的名字是随便命名的,现在要严格的按照java的属性来命名:
测试:
在这里设置一个断点
以调试模式来运行:
控制台上有这样一句:
表示路径映射到了方法,参数是一个学生对象。
点击确认:
断点到位。
student都有了,原来要自己写:
这些才可以。
原来要写中文格式化:
现在只要配置一下过滤器就能全部中文格式化(下面会说道)。原来是在if-else的东西,现在写到各自的方法里去。
让他跑完;
所有的数据已经封装进去了。
接下来就是Service了,复制原来的Service:
新建包:service和dao
dao只要MybatisDao就好
Mybatis还需要工具类:
再新建一个包
总的长这样:
这里是因为没有Mybatis报错了:
来到pom.xml,添加:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
这报错消失了:
现在还需要驱动:
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
导入了一个用不到的东西,删掉就好:
Mybatis还需要配置文件:
新建包config,完整如下:
Controllrt修改如下:
@PostMapping("/student/save")
public String createStudent(Student stu) throws Exception{
System.out.println(stu);
StudentService stuService = new StudentServiceImpl();
stuService.regStudent(stu);
return null;
}
测试:
如果出现这个,表示还有一个服务器还活着。
如果杀不死,在任务管理器找到这个进程,杀掉他就OK:
是404:
是没问题的。
数据库里是有的:
再试试中文:
出现乱码:
处理中文编码。
只要使用字符编码过滤器就好了。
过滤器的名字是编码过滤器,字符过滤以utf-8进行:
<filter>
<filter-name>EncodingFilter</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>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
完整web.xml如下,注意添加顺序:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>stuinfo</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>EncodingFilter</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>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
测试中文:
中文正常:
接下来是loadStus,回到控制器再写一个方法。
方法的格式是,返回一个字符串抛出一个异常。
加载学生列表,是Get提交。
得到的学生列表使用传入的模型来保存到请求范围。
要什么只要在方法的参数中指明需要的东西,他会帮你传进来,这是注入依赖。
模型是一个数据存储的地方。
复制原先的list_student.jsp到views目录下。
看一下原来控制器的Key是什么:
list_student.jsp是到请求范围去取数据的,如果list_student.jsp可以正常工作,那就表示,数据有存到请求范围。
@GetMapping("/student/loadStus")
public String loadStus(Model model) throws Exception{
StudentService stuService = new StudentServiceImpl();
List<Student> stuList = stuService.loadStus();
以key/value键值对形式保存到模型,其实就是保存到request范围(请求范围)
model.addAttribute("stuList", stuList);
return "list_student";//去到页面,叫list_student
}
测试:
访问/student/loadStus:
路径要改为resources:
可以了
但是两个页面之间还没有通过重定向连接起来。
修改方法loadStus的返回值即可:
@PostMapping("/student/save")
public String createStudent(Student stu) throws Exception{
System.out.println(stu);
StudentService stuService = new StudentServiceImpl();
stuService.regStudent(stu);
// return null;
return "redirect:/student/loadStus";
}
测试:
可以跳转。
OK