小菜鸟之SSM框架

时间:2024-01-29 17:51:18
  1 # SSM框架
  2 
  3 # **什么是框架**
  4 
  5 就是模板,将一些基础性的程序和代码由框架模板提供,然后程序员补充和业务需求相关的代码。
  6 
  7 # **ssm框架组成**
  8 
  9 s: springMvc 子框架  代替servlet类,control层
 10 
 11 s: spring     框架系列
 12 
 13 ​			基本作用:创建对象(控制反转和依赖注入)
 14 
 15 m: mybatis 框架  代替dao包,和数据库进行交互(jdbc技术),表     		示model层(service包和dao包)
 16 
 17 **补充**
 18 
 19 ​	view层:视图层,还是使用jsp实现
 20 
 21 # **项目演示**
 22 
 23 ## 目标:用户管理项目
 24 
 25 ## 操作步骤:
 26 
 27 ### 1、创建maven项目,并配置tomcat服务器
 28 
 29 **配置tomcat时无artifact选项解决方案**
 30 
 31 <img src="img/1573611676801.png" alt="1573611676801" style="zoom:33%;" />
 32 
 33 
 34 
 35 打开
 36 
 37 <img src="img/1573611734587.png" alt="1573611734587" style="zoom:33%;" />
 38 
 39 选择
 40 
 41 <img src="img/1573611802769.png" alt="1573611802769" style="zoom:33%;" />
 42 
 43 
 44 
 45 ### 2、创建java和resources目录,并mark一下,新建文件夹变色
 46 
 47 ![1573519990356](img/ssm.md)
 48 
 49 java文件夹:存放程序员编写的java代码
 50 
 51 resources文件夹:存放配置文件(和ssm框架相关)
 52 
 53 ### 3、myBatis框架(替代jdbc技术)
 54 
 55 #### 3.1 导入和mybatis相关的依赖(包)
 56 
 57 mybatis
 58 
 59  mybatis-spring
 60 
 61 mysql-connector-java
 62 
 63 ```xml
 64 <!--mybatis-->
 65     <dependency>
 66       <groupId>org.mybatis</groupId>
 67       <artifactId>mybatis</artifactId>
 68       <version>3.5.2</version>
 69     </dependency>
 70     <!--mybatis-spring 二者的整合-->
 71     <dependency>
 72       <groupId>org.mybatis</groupId>
 73       <artifactId>mybatis-spring</artifactId>
 74       <version>2.0.2</version>
 75     </dependency>
 76     <!--mysql-connector-java  用于java程序连接mysql数据库-->
 77     <dependency>
 78       <groupId>mysql</groupId>
 79       <artifactId>mysql-connector-java</artifactId>
 80       <version>8.0.17</version>
 81     </dependency>
 82 ```
 83 
 84 #### 3.2 在resources文件夹中创建文件mybatis-config.xml
 85 
 86 ```xml
 87 <?xml version="1.0" encoding="UTF-8" ?>
 88 <!DOCTYPE configuration
 89         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 90         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 91 <configuration>
 92 <!--该文件中可以对mybatis框架进行一些配置设置-->
 93 
 94 </configuration>
 95 ```
 96 
 97 ### 4.spring框架
 98 
 99 #### 4.1添加和spring相关的常用的依赖
100 
101 spring-beans
102 
103 spring-context/spring-context-support
104 
105 spring-core
106 
107 spring-expression
108 
109 spring-jdbc
110 
111 spring-tx
112 
113 spring-web
114 
115 commons-dbcp
116 
117 ```xml
118 <dependency>
119       <groupId>org.springframework</groupId>
120       <artifactId>spring-beans</artifactId>
121       <version>5.1.8.RELEASE</version>
122     </dependency>
123     <dependency>
124       <groupId>org.springframework</groupId>
125       <artifactId>spring-context</artifactId>
126       <version>5.1.8.RELEASE</version>
127     </dependency>
128     <dependency>
129       <groupId>org.springframework</groupId>
130       <artifactId>spring-context-support</artifactId>
131       <version>5.0.10.RELEASE</version>
132     </dependency>
133     <dependency>
134       <groupId>org.springframework</groupId>
135       <artifactId>spring-core</artifactId>
136       <version>5.1.8.RELEASE</version>
137     </dependency>
138     <dependency>
139       <groupId>org.springframework</groupId>
140       <artifactId>spring-expression</artifactId>
141       <version>5.1.8.RELEASE</version>
142     </dependency>
143     <dependency>
144       <groupId>org.springframework</groupId>
145       <artifactId>spring-jdbc</artifactId>
146       <version>5.0.10.RELEASE</version>
147     </dependency>
148     <dependency>
149       <groupId>org.springframework</groupId>
150       <artifactId>spring-tx</artifactId>
151       <version>5.1.8.RELEASE</version>
152     </dependency>
153     <dependency>
154       <groupId>org.springframework</groupId>
155       <artifactId>spring-web</artifactId>
156       <version>5.1.8.RELEASE</version>
157     </dependency>
158 
159     <!--commons-dbcp 用于创建dataSource数据源-->
160     <dependency>
161       <groupId>commons-dbcp</groupId>
162       <artifactId>commons-dbcp</artifactId>
163       <version>1.4</version>
164     </dependency>
165 ```
166 
167 
168 
169 #### 4.2在resources文件夹创建applicationContext.xml文件,用于对spring框架配置的设置
170 
171 ```xml
172 <?xml version="1.0" encoding="UTF-8"?>
173 <beans xmlns="http://www.springframework.org/schema/beans"
174        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
175        xmlns:context="http://www.springframework.org/schema/context"
176        xsi:schemaLocation="http://www.springframework.org/schema/beans
177        http://www.springframework.org/schema/beans/spring-beans.xsd
178        http://www.springframework.org/schema/context
179        https://www.springframework.org/schema/context/spring-context.xsd">
180 <!--用于spring框架的配置设置-->
181 
182 </beans>
183 ```
184 
185 ### 5.springmvc框架
186 
187 #### 5.1添加依赖(jar包)
188 
189 spring-mvc
190 
191 ```xml
192     <!--springmvc的依赖-->
193     <dependency>
194       <groupId>org.springframework</groupId>
195       <artifactId>spring-webmvc</artifactId>
196       <version>5.1.5.RELEASE</version>
197     </dependency>
198 ```
199 
200 
201 
202 #### 5.2在resources目录下创建springmvc-servlet.xml文件,对springmvc进行的配置设置
203 
204 ```xml
205 <?xml version="1.0" encoding="UTF-8"?>
206 <beans xmlns="http://www.springframework.org/schema/beans"
207        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
208        xmlns:mvc="http://www.springframework.org/schema/mvc"
209      xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans
210        http://www.springframework.org/schema/beans/spring-beans.xsd
211        http://www.springframework.org/schema/context
212        https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
213     <!--该文件用于对springmc框架的配置设置-->
214 
215 
216 </beans>
217 ```
218 
219 #### **注意处理**
220 
221 ![1573526006338](img/1573526006338.png)
222 
223 
224 
225 ### 6.在java目录下创建一些基本的包
226 
227 dao  :用于连接数据库
228 
229 service:用于进行业务逻辑的处理
230 
231 controller:用于对请求的派发和处理
232 
233 pojo:将数据库的表名定义为类名,字段定义为属性,此类放在此包中
234 
235 interceptor:拦截器包,使用的场景:处理非法登陆。
236 
237 util:工具包,存放一些工具类,比如jdbcUtil,分页插件类等等。
238 
239 test:测试包,用于测试,junit等进行测试。
240 
241 <img src="img/1573526271379.png" alt="1573526271379" style="zoom:33%;" />
242 
243 ### 7.pojo中类的创建和编写
244 
245 根据数据库中的表创建对应类,好处是通过操作pojo类,来代替操作数据库中的表(对象关系映射orm技术)
246 
247 ```java
248 //表名对应类名
249 public class User {
250 
251     //表字段对应类属性
252     private int id;
253     private String username;
254     private String password;
255 
256     public int getId() {
257         return id;
258     }
259 
260     public void setId(int id) {
261         this.id = id;
262     }
263 
264     public String getUsername() {
265         return username;
266     }
267 
268     public void setUsername(String username) {
269         this.username = username;
270     }
271 
272     public String getPassword() {
273         return password;
274     }
275 
276     public void setPassword(String password) {
277         this.password = password;
278     }
279 }
280 
281 ```
282 
283 ### 8、在resources目录下,创建database.properties文件,该文件中编写:driver,url,username,password等连接数据库的参数
284 
285 ```xml
286 driver=com.mysql.jdbc.Driver
287 url=jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
288 user=root
289 password=root
290 ```
291 
292 ### 9、进行java应用项目连接数据库
293 
294 **在applicationContext.xml文件下**
295 
296 ```xml
297 <!--1 引入database.properties文件-->
298 <context:property-placeholder location="classpath:database.properties"/>
299 
300 <!--2 创建数据源-->
301     <!--基本数据源(配置数据源)-->
302     <!-- 配置数据源,核心类:基本数据源BasicDataSource类 -->
303     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="singleton">
304         <property name="driverClassName" value="${driver}"/>
305         <property name="url" value="${url}"/>
306         <property name="username" value="${user}"/>
307         <property name="password" value="${password}"/>
308     </bean>
309 
310     <!--3 对数据源进行事务管理-->
311     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
312         <property name="dataSource" ref="dataSource"/>
313     </bean>
314 
315     <!--4 配置mybatis核心类SqlSessionFactoryBean,引入数据源,引入mybatis-config.xml-->
316     <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
317         <property name="dataSource" ref="dataSource"/>
318         <property name="configLocation" value="classpath:mybatis-config.xml"/>
319     </bean>
320 ```
321 
322 ### 10、在dao包中创建接口和mapper文件,在spring配置文件中配置
323 
324 在mapper文件中编写sql语句
325 
326 <img src="img/1573530423150.png" alt="1573530423150" style="zoom:25%;" />
327 
328 #### **a 创建接口UserMapper**
329 
330 ```java
331 public interface UserMapper {
332     //登陆功能
333     public User login(@Param("xiaomao")String username,@Param("xiaogou")String password);
334 }
335 ```
336 
337 
338 
339 #### **b 创建UserMapper文件**
340 
341 ```xml
342 <?xml version="1.0" encoding="UTF-8" ?>
343 <!DOCTYPE mapper
344         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
345         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
346 <mapper namespace="com.baidu.dao.UserMapper">
347     <!--namespace 赋值:对应的接口全路径-->
348         <!--select * from user where username=? and password=?-->
349     <!--id 填写 对应的接口方法名, resultType 填写接口方法的返回类型-->
350     <!--登陆方法-->
351     <select id="login" resultType="com.baidu.pojo.User">
352         select * from user where username=#{xiaomao} and password=#{xiaogou}
353     </select>
354 </mapper>
355 ```
356 
357 #### c 在applicationContext中配置对mapper文件扫描
358 
359 ```xml
360     <!--映射扫描配置器(引入sql映射文件)-->
361     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
362         <property name="basePackage" value="com.baidu.dao"/>
363     </bean>
364 ```
365 
366 #### d 在pom.xml中<build>内添加
367 
368 **将src/main/java目录下的所有*.xml文件编译到class内,不然报错:找不到mapper文件**
369 
370 ```xml
371 <build>
372       <!--将java目录下的所有*.xml文件编译到class内,不然报错:找不到mapper文件-->
373     <resources>
374       <resource>
375         <directory>src/main/java</directory>
376         <includes>
377           <include>**/*.xml</include>
378         </includes>
379         <filtering>false</filtering>
380       </resource>
381     </resources>
382 </build>
383 ```
384 
385 
386 
387 ### 11、在service包中创建接口和实现类,编写业务逻辑代码
388 
389 #### 接口
390 
391 ```java
392 public interface UserService {
393     //登陆功能
394     public boolean login(String username,String password);
395 }
396 ```
397 
398 #### 实现类
399 
400 ```java
401 public class UserServiceImpl implements  UserService {
402 
403     @Resource//此时报错,缺少依赖:javax.annotation-api
404     private UserMapper userMapper=null;
405 
406     //登陆方法
407     public boolean login(String username, String password) {
408         User user = userMapper.login(username, password);
409         boolean flag=false;
410         if(user!=null){//用户存在
411             flag=true;
412         }
413         return flag;
414     }
415 }
416 ```
417 
418 #### **补充支持@Resource注解的依赖**
419 
420 ```xml
421     <!--@Resource-->
422     <dependency>
423       <groupId>javax.annotation</groupId>
424       <artifactId>javax.annotation-api</artifactId>
425       <version>1.3.1</version>
426     </dependency>
427 ```
428 
429 
430 
431 ### 12、在applicationContext.xml文件中对组件进行定义和扫描
432 
433 #### **组件扫描**
434 
435 ##### a、定义组件
436 
437 编写userController类,将@Controller 放在controller包的类上
438 
439 ```java
440 @Controller
441 public class UserController {
442    //编写对请求的派发和处理
443 
444 }
445 ```
446 
447 @Service  放在service包的实现类上
448 
449 ```java
450 public interface UserService {
451     //登陆功能
452     public boolean login(String username,String password);
453 }
454 ```
455 
456 ```
457 @Service
458 public class UserServiceImpl implements  UserService {
459 
460     @Autowired//@Resource同一功能
461     private UserMapper userMapper=null;
462 
463     //登陆方法
464     public boolean login(String username, String password) {
465         User user = userMapper.login(username, password);
466         boolean flag=false;
467         if(user!=null){//用户存在
468             flag=true;
469         }
470         return flag;
471     }
472 }
473 ```
474 
475 
476 
477 @Repository 放在dao包的实现类上(如果没有实现类,就省略)
478 
479 ```java
480 public interface UserMapper {
481     //登陆功能
482     public User login(@Param("xiaomao") String username, @Param("xiaogou") String password);
483 }
484 ```
485 
486 ##### b、在applicationContext.xml容器中配置,使组件生效
487 
488 ```xml
489 <!--组件浏览-->
490     <context:component-scan base-package="com.baidu.service"/>
491     <context:component-scan base-package="com.baidu.dao"/>
492 
493     <!--注解配置-->
494     <context:annotation-config/>
495 ```
496 
497 ##### c、在springmvc-serlvet.xml容器中配置,使组件生效
498 
499 ```java
500 <!-- 支持组件-->
501     <context:component-scan base-package="com.baidu.controller"/>
502 ```
503 
504 ### 13、配置web.xml文件
505 
506 #### a."<web-app>"中添加属性
507 
508 ```xml
509 <web-app
510         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
511         xmlns="http://java.sun.com/xml/ns/javaee"
512         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
513         id="WebApp_ID" version="3.0">
514 ```
515 
516 #### b、配置监听器
517 
518 ```xml
519   <!-- 配置监听器  -->
520   <listener>
521     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
522   </listener>
523 ```
524 
525 #### c、引入spring配置文件
526 
527 ```xml
528   <!--引入spring的配置文件,制定文件的位置-->
529   <context-param>
530     <param-name>contextConfigLocation</param-name>
531     <param-value>classpath:applicationContext.xml</param-value>
532   </context-param>
533 ```
534 
535 #### d、配置DispatcherServlet(类似于“总机调度”)
536 
537 ```xml
538 <!--配置DispatcherServlet-->
539   <servlet>
540     <servlet-name>DispatcherServlet</servlet-name>
541     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
542     <init-param>
543       <param-name>contextConfigLocation</param-name>
544       <param-value>classpath:springmvc-servlet.xml</param-value>
545     </init-param>
546     <load-on-startup>1</load-on-startup>
547   </servlet>
548   <servlet-mapping>
549     <servlet-name>DispatcherServlet</servlet-name>
550     <!--所有的请求都要被拦截,然后进行转发-->
551     <url-pattern>/</url-pattern>
552   </servlet-mapping>
553 ```
554 
555 ### 14、配置springmvc-servlet.xml
556 
557 #### a、配置对组件@Controller的扫描(上述已经操作)
558 
559 ```xml
560    <!-- 支持组件-->
561     <context:component-scan base-package="com.baidu.controller"/>
562 ```
563 
564 #### b、支持注解
565 
566 (@RequestMapping,@RequestParam等)
567 
568 ```xml
569 <!--支持注解-->
570 <mvc:annotation-driven/>
571 ```
572 
573 #### c、配置视图解析器
574 
575 - /WEB-INF/下创建jsp文件夹
576 
577 - 通过逻辑视图名(jsp文件的文件名)找到真实的视图名(jsp文件的全名)
578 
579   ​	举例:  真实的视图名 index.jsp 《---逻辑视图名 jsp
580 
581   ​	比如: /WEB-INF/jsp/index.jsp
582 
583 ```xml
584 <!--配置视图解析器-->
585 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
586 <property name="prefix" value="/WEB-INF/jsp/"/>
587 <property name="suffix" value=".jsp"/>
588 </bean>
589 ```
590 
591 #### d、引入静态资源
592 
593 - 在webapp下创建statics文件夹
594 - 在springmvc-servlet.xml配置文件中添加
595 
596 ```xml
597 <!--引入静态资源--><mvc:resources mapping="/statics/**" location="/statics/"/>
598 ```
599 
600 ### 15、在controller类中创建控制器方法
601 
602 ```java
603 /**
604  * @author 四两数字先生(CSDN/公众号)
605  */
606 @Controller
607 @RequestMapping("/user")
608 public class UserController {
609 
610     //private UserService userService=new UserServiceImpl();
611     @Resource  //自动装配
612     private UserService userService;
613 
614     @RequestMapping("/index")
615     public String index(){
616         return "index";//index就是逻辑视图名
617     }
618     @RequestMapping("/login")
619     public String login(@RequestParam(value = "xiaogou",required = false) String username,
620                         @RequestParam(value = "xiaomao",required = false) String password){
621         boolean flag = this.userService.login(username, password);
622         if(flag){//用户存在
623             return "success";
624              }
625         return "failure";
626     }
627 }
628 ```
629 
630 ### 16、编写jsp文件index.jsp
631 
632 a.编写登陆表单
633 
634 ```html
635 <form method="get" action="<%=request.getContextPath() %>/user/login">
636     用户名:<input type="text" name="xiaogou" value="">
637     密码:<input type="password" name="xiaomao" value="">
638     <input type="submit" name="submit" value="登陆">
639 </form>
640 ```
641 
642 b.添加 sevlet-api依赖
643 
644 ```xml
645     <!--servlet-api-->
646     <dependency>
647       <groupId>javax.servlet</groupId>
648       <artifactId>javax.servlet-api</artifactId>
649       <version>4.0.1</version>
650     </dependency>
651 ```
652 
653 b.编写登陆成功页面success.jsp
654 
655 ```
656 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
657 <html>
658 <head>
659     <title>登陆成功</title>
660 </head>
661 <body>
662 <h1>登陆成功</h1>
663 </body>
664 </html>
665 ```
666 
667 
668 
669 c.编写登陆失败页面failure.jsp
670 
671 ```
672 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
673 <html>
674 <head>
675     <title>登陆失败</title>
676 </head>
677 <body>
678 <h1>登陆失败</h1>
679 </body>
680 </html>
681 ```
682 
683 # Spring的两大核心技术
684 
685 ## 控制反转/依赖注入
686 
687 1、添加依赖
688 
689 spring-core
690 
691 spring-context
692 
693 spring-beans
694 
695 spring-expression
696 
697 日志依赖
698 
699 log4j
700 
701 commons-logging
702 
703 
704 
705 2、编写代码
706 
707 验证控制反转/依赖注入
708 
709 applicationContext.xml
710 
711 ```xml
712 <?xml version="1.0" encoding="UTF-8"?>
713 <beans xmlns="http://www.springframework.org/schema/beans"
714        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
715        xmlns:context="http://www.springframework.org/schema/context"
716        xsi:schemaLocation="http://www.springframework.org/schema/beans
717        http://www.springframework.org/schema/beans/spring-beans.xsd
718        http://www.springframework.org/schema/context
719        https://www.springframework.org/schema/context/spring-context.xsd">
720 
721     <bean id="person1" class="com.baidu.Person">
722         <property name="name" value="张三"/>
723     </bean>
724 
725 
726 </beans>
727 ```
728 
729 person.java
730 
731 ```java
732 /**
733  * @author 四两数字先生(CSDN/公众号)
734  */
735 public class Person {
736     String name;
737 
738     public String getName() {
739         return name;
740     }
741 
742     public void setName(String name) {
743         this.name = name;
744     }
745 
746     //speak方法
747     public void speak(){
748         System.out.println(name+"speak hello world");
749     }
750 }
751 
752 ```
753 
754 MyTest.java
755 
756 ```java
757 /**
758  * @author 四两数字先生(CSDN/公众号)
759  */
760 public class MyTest {
761 
762     @Test
763     public  void test1(){
764         /**
765          * 通过代码创建对象
766          * 通过代码给属性赋值
767          */
768         //创建对象
769         Person person=new Person();
770         //给属性赋值
771         person.setName("张三");
772         //调用speak方法输出
773         person.speak();
774 
775     }
776 
777     @Test
778     public void test2(){
779         /**
780          * 通过spring技术之一:控制反转/依赖注入实现来实现
781          * 1  由spring容器创建对象
782          * 2  由spring容器给属性赋值
783          *
784          * 控制反转/依赖注入:
785          * 控制权正转:通过java代码创建对象和给属性赋值
786          * 控制权反转: 将创建对象和给属性赋值的权利反转给spring容器;
787          * 控制反转就等价于依赖注入
788          *
789          */
790         //调用speak方法输出
791         //通过spring配置文件,获得对象ApplicationContext
792         ApplicationContext applicationContext =
793                 new ClassPathXmlApplicationContext
794                         ("applicationContext.xml");
795 
796         Person person1 = (Person) applicationContext.getBean("person1");
797 
798         person1.speak();
799 
800     }
801 }
802 
803 ```
804 
805 ## 面向切面编程技术
806 
807 在编写代码的过程中,有些代码和业务相关(比如增删改查功能),有些代码和业务没有直接关系,但是是必不可少(日志,安全权限等)
808 
809 1、添加依赖
810 
811 spring-core
812 
813 spring-context
814 
815 spring-beans
816 
817 spring-expression
818 
819 **和日志相关**
820 
821 commons-logging
822 
823 log4j
824 
825 **和aop相关**
826 
827 spring-aop
828 
829 aopalliance
830 
831 aspectjweave
832 
833 # springMvc
834 
835 ## **参数传递(View to Controller)**
836 
837 ### **url含参传递(@RequestParam)**
838 
839 ```java
840 @Controller
841 public class IndexController{
842 
843      @RequestMapping(“/welcome”)
844 
845      public String index(@RequestParam(value=”username”, required=false)String username){
846 
847 
848 }
849 
850 }
851 ```
852 
853 ### **更精确的url含参传递(@RequestMapping)**
854 
855 注意:http请求信息不仅不含请求url地址,还包含请求方法/请求参数/请求头
856 
857 ```
858 @RequestMapping(value=”/welcome”, method=RequestMethod.GET, params=”username”)
859 
860 public String index(@RequestParam String username){
861 
862    logger.info(username);
863 
864    return “index”;
865 
866 }
867 ```
868 
869 ## **参数传递(Controller to View)**
870 
871 ### **ModelAndView实现参数传递**
872 
873 ```java
874 Controller
875 
876    @Request Mapping(“/welcome”)
877 public String index(@RequestParam(value=”username”,required=false) String username){
878          logger.info();
879         ModelAndView m=new ModelAndView();
880          m.addObject(username);
881          m.setViewName(“index”);
882          Return m;
883 }
884 ```
885 
886 index.jsp 获得容器中的参数
887 
888 ```html
889  <h2 >modelAndView(key:default)--->${string}</h2>
890 ```
891 
892 ### **Model实现参数传递**
893 
894 需要使用到el表达式需要添加什么?
895 
896 web.xml需要修改?
897 
898 添加 web-app 后面的属性内容才能支持el表达式
899 
900 ```xml
901 <?xml version="1.0" encoding="UTF-8"?>
902 
903 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
904 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
905 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
906 version="3.0">
907 </web-app>
908 ```
909 
910 Controller层
911 
912 ```java
913   @RequestMapping(“/welcome”)
914 public String index(@RequestParam String username, Model model){
915 logger.info();
916 
917        //1
918       model.addAttribute(“username”,username);
919 
920        //2
921         model.addAttribute(username);
922 
923        //3
924        User user= new User();
925        user.setUserName(username);                  model.addAttribute(“currentUserName”,user);
926  Return “index”;
927 
928 }
929 ```
930 
931 Index.jsp
932 
933 ```html
934 <h1>model(key:username)---->  ${username}</h1>
935 
936 <h1>model(key:default)------->  ${string}</h1>
937 
938 <h1>model(key:currentUserName)---->${currentUseName.userName}</h1>
939 ```
940 
941 ### **Map实现参数传递**
942 
943 Controller
944 
945 注意:Map<String,Object> model 必须以形参的方式引入
946 
947 ```java
948 @RequestMapping(“/welcome”)
949   public String index(@RequestParam(value=”username”)  String username,Map<String,Object> map){
950 map.put(“username”,username);
951 return “index”;
952 }
953 ```
954 
955 # Ajax技术
956 
957 1 register.jsp
958 
959 ```java
960 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
961 <html>
962 <head>
963     <title>注册</title>
964     <script src="statics/js/jquery-3.4.1.js"></script>
965     <script>
966         $(document).ready(function () {
967             $("#name").blur(function () {
968                 var name=this.value;
969                 if(name==null || name==""){
970                     $("#nameDiv").html("用户名不能为空");
971                 }else {
972                     $.ajax({
973 
974                         "url" :"<%=request.getContextPath()%>/AjaxServlet",//action
975                         "data":"name1="+name, //含参 &name=lisi
976                         "type" :"get",//method 请求方式
977 
978                         "success":callBack,//返回结果成功,写函数名
979                         "dataType":"text",//返回的数据类型
980                         "error": function () {
981                             alert("返回结果失败");
982                         }
983                     });
984 
985                     function callBack(data) {//返回的结果
986                         if(data=="true"){//== 字符串
987                             $("#nameDiv").html("该用户已被使用");
988                         }else{
989                             $("#nameDiv").html("该用户可以使用");
990                         }
991                     }
992                 }
993             });
994         });
995     </script>
996 </head>
997 <body>
998 <form action="" method="">
999     <%--请求方式
1000         get  表单中参数会出现url路径中
1001         post 表单的参数不会出现在url路径中,更加安全
1002     --%>
1003     <h1>注册页面</h1>
1004     姓名:<input type="text" name="username" value="" id="name">
1005             <div id="nameDiv"></div>
1006     密码:<input type="password" name="password" value="">
1007     再次确认密码:<input type="password" name="password" value="">
1008     <input type="submit" name="register" value="注册">
1009 </form>
1010 </body>
1011 </html>
1012 ```
1013 
1014 2 AjaxServlet.jsp
1015 
1016 ```java
1017 package com.baidu.servlet;
1018 
1019 import com.baidu.service.UserService;
1020 import com.baidu.service.UserServiceImpl;
1021 
1022 import javax.servlet.ServletException;
1023 import javax.servlet.annotation.WebServlet;
1024 import javax.servlet.http.HttpServlet;
1025 import javax.servlet.http.HttpServletRequest;
1026 import javax.servlet.http.HttpServletResponse;
1027 import java.io.IOException;
1028 import java.io.PrintWriter;
1029 
1030 /**
1031  * @author 四两数字先生(CSDN/公众号)
1032  */
1033 public class AjaxServlet extends HttpServlet {
1034 
1035 
1036     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
1037         this.doGet(request,response);
1038     }
1039 
1040     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
1041         //编写代码
1042         //防止中文乱码
1043         request.setCharacterEncoding("utf-8");
1044         String name = request.getParameter("name1");//name是哪里
1045         boolean  flag=false;
1046 
1047         //模拟数据库:假设数据库中存在用户名"admin"
1048         if(name.equals("admin")){
1049                 flag=true;//boolean 型返回前端时自动变成字符串"true"
1050         }
1051 
1052         response.setContentType("text/html;charset=utf-8");
1053         PrintWriter writer = response.getWriter();
1054         writer.print(flag);//将flag返回给前端
1055         writer.flush();
1056         writer.close();
1057 
1058     }
1059 }
1060 ```
1061 
1062 3 web.xml
1063 
1064 ```xml
1065 <!DOCTYPE web-app PUBLIC
1066  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
1067  "http://java.sun.com/dtd/web-app_2_3.dtd" >
1068 
1069 <web-app
1070         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
1071         xmlns="http://java.sun.com/xml/ns/javaee"
1072         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
1073         id="WebApp_ID" version="3.0"
1074 >
1075   <display-name>Archetype Created Web Application</display-name>
1076 
1077   <servlet>
1078     <servlet-name>AjaxServlet</servlet-name>
1079     <servlet-class>com.baidu.servlet.AjaxServlet</servlet-class>
1080   </servlet>
1081   <servlet-mapping>
1082     <servlet-name>AjaxServlet</servlet-name>
1083     <url-pattern>/AjaxServlet</url-pattern>
1084   </servlet-mapping>
1085 
1086   <servlet>
1087     <servlet-name>MyServlet</servlet-name>
1088     <servlet-class>com.baidu.servlet.MyServlet</servlet-class>
1089   </servlet>
1090   <servlet-mapping>
1091     <servlet-name>MyServlet</servlet-name>
1092     <url-pattern>/MyServlet</url-pattern>
1093   </servlet-mapping>
1094 </web-app>
1095 ```
1096 
1097 # Json格式数据
1098 
1099 ```html
1100 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
1101 <html>
1102 <head>
1103     <title>Title</title>
1104     <script src="statics/js/jquery-3.4.1.js"></script>
1105     <script>
1106         $(document).ready(function() {
1107 
1108             //1、定义JSON格式的user对象,并在div中输出
1109             var user = {
1110                 "id" : 1,
1111                 "name" : "张三",
1112                 "pwd" : "000"
1113             };
1114             $("#objectDiv").append("ID:" + user.id + "<br>")
1115                 .append("用户名:" + user.name + "<br>")
1116                 .append("密码:" + user.pwd + "<br>");
1117 
1118             //2、定义JSON格式的字符串数组,在ul中输出
1119             var ary = [ "中", "美", "俄" ];
1120             var $ary = $(ary);
1121             var $ul = $("#arrayUl"); // 展示数据的ul元素
1122             $ary.each(function() {
1123                 $ul.append("<li>"+this+"</li>");
1124             });
1125 
1126             //3、定义JSON格式的字符串数组,在select中输出
1127             var $sel = $("#arraySel"); // 展示数据的select元素
1128             $ary.each(function(i) {//index 索引
1129                 /**
1130                  * <select name=“国籍” id=“arraySel”>
1131                  *     <option value=1></option>
1132                  *     <option value=2></option>
1133                  *     <option value=3></option>
1134                  * </select>
1135                  */
1136                 //"<option value=\'"+(i+1)+"\'>"
1137                 $sel.append("<option value=\'"+(i+1)+"\'>"+this+"</option>");
1138             });
1139 
1140             //4、定义JSON格式的user对象数组,并使用<table>输出
1141             var userArray = [ {
1142                 "id" : 2,
1143                 "name" : "admin",
1144                 "pwd" : "123"
1145             }, {
1146                 "id" : 3,
1147                 "name" : "詹姆斯",
1148                 "pwd" : "11111"
1149             }, {
1150                 "id" : 4,
1151                 "name" : "梅西",
1152                 "pwd" : "6666"
1153             } ];
1154             /**<div id="objectArrayDiv">
1155              * <table border=\'1\'>
1156              *     <tr><td>ID</td><td>用户名</td><td>密码</td></tr>
1157              *     <tr><td>2</td><td>admin</td><td>123</td></tr>
1158              *     <tr><td>3</td><td>詹姆斯</td><td>11111</td></tr>
1159              *     <tr><td>4</td><td>梅西</td><td>666</td></tr>
1160              *  </table>
1161              *  <div>
1162              *   我是中国人我爱中国我爱人民人民爱我
1163              */
1164             var $table = $("<table border=\'1\'></table>").append(
1165                 "<tr><td>ID</td><td>用户名</td><td>密码</td></tr>");
1166             $(userArray).each(function() {
1167                 $table.append("<tr><td>" + this.id + "</td><td>"
1168                     + this.name + "</td><td>"
1169                     + this.pwd + "</td></tr>");
1170             });
1171             $("#objectArrayDiv").append($table);
1172 
1173         });
1174     </script>
1175 </head>
1176 <body>
1177     <%--div中呈现普通对象--%>
1178     <div id="objectDiv"></div>
1179     <%--无序列表形式呈现数组--%>
1180     <div>
1181         <ul id="arrayUl">
1182 
1183         </ul>
1184     </div>
1185     <%--下拉列表形式呈现数组--%>
1186     <div>
1187         <select id="arraySel"></select>
1188     </div>
1189     <%--表格形式呈现对象数组--%>
1190     <div id="objectArrayDiv">
1191 
1192     </div>
1193 </body>
1194 </html>
1195 ```
1196 
1197 # SpringMVC参数传递
1198 
1199 ```java
1200 @Controller
1201 @RequestMapping("/user")
1202 public class UserController {
1203 
1204     //private UserService userService=new UserServiceImpl();
1205     @Resource  //自动装配
1206     private UserService userService;
1207 
1208     //无参数的url :localhost:8080/项目名/user/index
1209     @RequestMapping("/index")
1210     public String index(){
1211         return "index";//index就是逻辑视图名
1212     }
1213     //含参的url:localhost:8080/项目名/user/login?xiaogou=lisi&xiaomao=lisi
1214     @RequestMapping(value = "/login")
1215     public String login(@RequestParam(value = "xiaogou",required = false) String username,
1216                         @RequestParam(value = "xiaomao",required = false) String password){
1217         boolean flag = this.userService.login(username, password);
1218         if(flag){//用户存在
1219             return "success";
1220              }
1221         return "failure";
1222     }
1223     //含参的url:localhost:8080/项目名/login?xiaogou=lisi&xiaomao=lisi
1224     //更精确的含参url:method = RequestMethod.POST
1225     @RequestMapping(value = "/login1" ,method = RequestMethod.POST)
1226     public String login1(@RequestParam(value = "xiaogou",required = false) String username,
1227                          @RequestParam(value = "xiaomao",required = false) String password){
1228         boolean flag = this.userService.login(username, password);
1229         if(flag){//用户存在
1230             return "success";
1231         }
1232         return "failure";
1233     }
1234 
1235     //Controller层传递到View
1236     //1 ModelAndView 作为返回对象
1237     @RequestMapping("/index1")
1238     public ModelAndView index1(){
1239         User user = new User();
1240         user.setId(1);
1241         user.setUsername("zhangsan");
1242         user.setPassword("123456");
1243 
1244         ModelAndView modelAndView = new ModelAndView();
1245         //存放数据
1246         modelAndView.addObject("user",user);//key-value
1247         //设置逻辑视图名
1248         modelAndView.setViewName("nankeyuan");
1249         return modelAndView;
1250     }
1251 
1252 //Model 作为一个容器,保存数据
1253     @RequestMapping("/index2")
1254     public String index2(Model model){
1255         model.addAttribute("str","hello model");
1256         //字符串类型 --key:string
1257         model.addAttribute("hello model2");
1258         return "nankeyuan";
1259     }
1260 
1261     //Map作为容器,保存数据
1262     @RequestMapping("/index3")
1263     public String index3(Map<String,Object> map){
1264         map.put("mapStr","map demo");
1265         return "nankeyuan";
1266     }
1267 }
1268 
1269 ```
1270 
1271 # 字符乱码过滤器
1272 
1273 web.xml
1274 
1275 ```
1276 <filter>
1277     <filter-name>characterFilter</filter-name>
1278     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
1279     <!-- 设置过滤器中的属性值 -->
1280     <init-param>
1281       <param-name>encoding</param-name>
1282       <param-value>UTF-8</param-value>
1283     </init-param>
1284     <!-- 启动过滤器 -->
1285     <init-param>
1286       <param-name>forceEncoding</param-name>
1287       <param-value>true</param-value>
1288     </init-param>
1289   </filter>
1290   <filter-mapping>
1291     <filter-name>characterFilter</filter-name>
1292     <!--表示项目名下的所有url都被拦截过滤-->
1293     <url-pattern>/*</url-pattern>
1294   </filter-mapping>
1295 
1296 ```
1297 
1298 ## Restful风格路径
1299 
1300 ```java
1301     //url中含参传递  restful风格路径
1302     //localhost:8080/userPro-ssm/user/index6/lisi   等价(?username=lisi)
1303     @RequestMapping("/index6/{username}")
1304     public String index6(@PathVariable(name = "username") String username){
1305         System.out.println("用户名为"+username);
1306         return "nankeyuan";
1307     }
1308 ```
1309 
1310