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