SSM¶
Spring、SpringMVC、Mybatis就是SSM。
Java项目和web项目¶
Maven构建项目类型:
Java项目(jar项目)是由main()方法来开始的,直接依赖JVM虚拟机就能被编译执行。Java项目不需要服务器。
Web项目(war项目)中的Java文件是tomcat服务器来触发的,脱离了web服务器就无法启动。Web项目需要服务器。Web项目部署到服务器上,任何用户都可以通过浏览器来访问。将本地资源共享给外部访问。入口是web.xml
。
Tomcat服务器¶
Tomcat服务器对Servlet,Jsp,JNDI,JavaMail有很好的的支持,并且这个Web容器是开源免费的。(Tomcat服务器是Apache下的)
Tomcat相当于电脑上的一个软件。
使用SpringMVC的原因¶
Spring是框架,SpringMVC也是框架。
前端|后端|数据库
后端获取前端传过来的数据,响应内容到前端。
前端和后端的交互。
SpringMVC是对servlet的封装,servlet底层需要依赖tomcat运行。
SpringMVC环境搭建(通过Maven构建项目)¶
1、创建maven-web项目¶
创建Maven-war项目步骤:
- 勾选
create from archetype
前面的复选框。 - 选择
org.apache.maven.archetypes:maven-archetype-webapp
,添加webapp模板。
maven版本设置
剩余步骤都点击Next按钮即可。
2、补全war项目目录¶
观察目录结构与jar项目不同之处,设置java目录为资源目录。 整体框架: 工程结构
创建完文件夹directory之后,需要右键Mark Directory as
选择Sources Root
、Resources Root
、Test Sources Root
。然后就可以在文件夹下创建各种文件。
3、pom.xml添加依赖和tomcat插件¶
3.1、添加依赖¶
- mybatis的依赖
- 连接mysql的依赖
- log4j的依赖
- spring的核心依赖
- springjdbc依赖
- spring整合mybatis的依赖
- springwebmvc的依赖
3.2、tomcat插件¶
3.2.1、使用本地tomcat(很少使用)¶
把项目放到tomcat里面,tomcat和项目联系。
3.2.2、maven中使用tomcat插件¶
tomcat和maven都是apache下的,同一个公司的。maven自带tomcat。
4、spring整合mybatis¶
applicationContext.xml¶
以前用mybatis先搞配置文件mybatis.xml,SSM整合后mybatis.xml都交由spring来管理,创建applicationContext.xml
。
<?xml version="1.0" encoding="UTF-8"?>
<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"
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">
<!-- 【1】连接数据库,获取数据源,配置数据源,设置数据库连接的四个参数 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 利用setter方法完成属性注入,四个参数名固定的,注意源码中虽然没有driverClassName属性,但是有driverClassName的setter方法 -->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/msb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="asdf123456"/>
</bean>
<!-- 【2】获取SqlSessionFactory对象 -->
<!-- 以前SqlSessionFactory都是在测试代码中我们自己创建的,但是现在不用了,整合包中提供的对于SqlSessionFactory的封装。里面提供了MyBatis全局配置文件所有配置的属性 -->
<!--在applicationContext.xml中加入mybatis.xml解析-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源-->
<property name="dataSource" ref="dataSource"/>
<!-- 给包下类起别名-->
<property name="typeAliasesPackage" value="com.hh.pojo"></property>
<!--解析mybatis.xml-->
<property name="configLocation" value="classpath:mybatis.xml"></property>
</bean>
<!-- 【3】扫描mapper文件-->
<!-- 设置扫描哪个包,进行接口绑定-->
<!-- 所有Mapper接口代理对象都能创建出来,可以直接从容器中获取出来。 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 和SqlSessionFactory产生联系,以前接口绑定sqlSession.getMapper(BookMapper.class);
都是通过以前接口绑定sqlSession来调用mapper,所以这里一定要注入工厂啊
注意这里sqlSessionFactoryBeanName类型为String,所以用value把工厂名字写过来就行-->
<property name="sqlSessionFactoryBeanName" value="factory"></property>
<!-- 扫描的包 接口对应的实现类 -->
<property name="basePackage" value="com.hh.mapper"></property>
</bean>
<!-- 【4】扫描com.hh.service包下注解 -->
<context:component-scan base-package="com.hh.service"></context:component-scan>
</beans>
mybatis.xml¶
日志是mybatis特有的配置方式,spring没有提供那样的配置,所以日志部分没法替代。所以可以把mybatis.xml
保留,里面留下这个log4j的配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 配置生效的日志 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
log4j.properties¶
log4j程序会自动去找 log4j.properties,log4j.properties还是需要的。
5、整合springmvc¶
5.1、springmvc.xml¶
下面第6步中写的注解需要解析,解析需要xml配置。在resources
中新建Spring MVC框架配置文件springmvc.xml
(注解需要在这个xml文件中进行解析)
加入springmvc.xml的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 扫描控制器类,千万不要把service等扫描进来,也千万不要在Spring配置文件扫描控制器类所在包 -->
<context:component-scan base-package="com.hh.controller"></context:component-scan>
<!-- 让Spring MVC的注解生效 :@RequestMapping等注解-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
5.2、web.xml¶
web项目的入口web.xml
。tomcat启动的时候走到这里。
在web.xml
中加入springmvc.xml
和applicationContext.xml
两个配置文件的解析:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
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_4_0.xsd"
version="4.0">
<!--servlet配置-->
<!--对SpringMVC解析-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 参数名称必须叫做:contextConfigLocation。单词和大小写错误都导致配置文件无法正确加载 -->
<param-name>contextConfigLocation</param-name>
<!-- springmvc.xml 名称自定义,只要和我们上面创建的配置文件的名称对应就可以了。 -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- Tomcat启动立即加载Servlet,而不是等到访问Servlet才去实例化DispatcherServlet -->
<!-- 配置上的效果:Tomcat启动立即加载Spring MVC框架的配置文件-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- /表示除了.jsp结尾的uri,其他的uri都会触发DispatcherServlet。此处前往不要写成 /* -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--新加入-->
<!--解析applicationContext.xml:利用监听器监听-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--给全局参数contextConfigLocation设置值,contextConfigLocation是ContextLoaderListener父类ContextLoader中的属性-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
6、项目分层¶
上面将整合的配置内容已经配置好了,接下来开始创建项目的目录结构。项目要分层,有controller控制层、service业务层、dao层(有数据库连接层(Mybits接口绑定),mapper层)、实体类层。
6.1、实体类¶
6.2、mapper数据库连接层¶
6.3、service业务层¶
6.4、controller控制层¶
7、启动项目tomcat¶
点击IDEA右侧Maven面板。
选择要运行的项目(配置插件的项目) -> Plugins -> tomcat8 -> tomcat8:run-war
,双击tomcat8:run-war启动。
乱码问题解决:¶
想要改变@ResonseBody注解的响应内容类型(Content-Type)只能通过@RequestMapping的produces属性进行设置。
8、通过浏览器测试访问结果¶
通过浏览器地址http://localhost:8888/testssm/findAllBooks访问到后端,后端返回。
SpringMVC接收请求参数¶
浏览器和后端进行交互,前端页面上面有一些数据,交由后端进行处理。
1、获取普通参数¶
获取普通参数,只需要在控制单元中提供与请求参数同名的方法参数即可,Spring MVC会自动进行类型转换。
请求路径http://localhost:8888/testspringmvc/testParam?name=zhan8gsan&age=99
package com.hh.controller;
import com.hh.pojo.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//注解 自动构建对象
@Controller
public class TestController {//控制器类
//注解,请求路径。浏览器访问/test1就会进到方法
@RequestMapping("/test1")
public String test1() {
//响应给浏览器index.jsp页面
return "index.jsp";
}
@RequestMapping("/testParam")
public String testParam(String name, int age){
System.out.println(name + "-------" + age);
return "index.jsp";
}
@RequestMapping("/testParam2")
public String testParam2(Person p){
System.out.println(p.getAge() + "====" + p.getName());
return "index.jsp";
}
}
2、使用类对象作为控制单元参数¶
如果前台参数比较多,可以使用一个类对象进行接收。之后再传到其它层比较方便。
JavaBean¶
一个包含私有属性,getter/setter方法和无参构造方法的Java类。
写法上和实体类相同。唯一区别是实体类是数据库层面的概念,类型中属性要和数据库字段对应。而JavaBean的属性是灵活的,不是必须和哪里对应的。
JavaBean是一个专业概念,可以简单点理解:使用类对象做为控制单元参数,接收请求参数。如果不是特别较真,狭义上可以认为JavaBean就是项目中的实体类。
在控制单元中放置一个类型对象,对象名称没有要求,只需要保证请求参数名和类的属性名相同就可以了。
一个类既可以是实体类又可以是JavaBean。