执行环境:IDEA学生版,Tomcat7.0.94,jdk_1.8.0_144
一、SpringMVC
参考链接:https://blog.youkuaiyun.com/weixin_42222334/article/details/80362126
备注:SpringMVC的配置过程大部分与这个博主的一致,添加了一些报错和知识点(留待自己以后参考使用)。
不知道是版本问题还是其他,没有SpringMVC选项,且不打算用SpringBoot,新建的是Maven项目,所有的目录和文件都是手动加的。
1.新建Maven-webapp项目
操作:File->New->Project->Maven->org.apache.maven.archetypes:maven-archetype-webapp
填写项目名,选择项目存储位置。
不用管,继续Next就行。
最终目录:
2.搭建MVC目录结构
a.按照如图所示目录结构新建文件夹及文件。
操作:右键->New->File/Directory(java的蓝图标和resources的小黄杠等见步骤b)
b.标记文件夹。
操作:File->Project Structure->Modules->Mark as...(选中下面的对应文件夹,点击上面mark图标标记为资源、测试、导出等,target不用,此时还没有)
3.配置文件
下面就是把那些空的xml配置文件都填写上去。
(1)pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress ALL -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Demo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Demo</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.10</version>
</dependency>
<!--J2EE-->
<!--我这里是因为tomcat里面有servlet-api.jar和jsp-api.jar,就不再新加这两个依赖,否则会报错-->
<!-- <dependency>-->
<!-- <groupId>javax.servlet</groupId>-->
<!-- <artifactId>javax.servlet-api</artifactId>-->
<!-- <version>3.1.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>javax.servlet.jsp</groupId>-->
<!-- <artifactId>jsp-api</artifactId>-->
<!-- <version>2.2</version>-->
<!-- </dependency>-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--mybatis相关的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<version>5.1.35</version>--><!--过低的版本会导致报错数据库连接不上-->
<version>8.0.11</version>
</dependency>
<!--springframework-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.6.RELEASE</version><!--或者${spring.version}这种格式-->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
<version>1.16.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!--其他需要的包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
<!--配置打包文件,有需要的可以参考这个格式写-->
<!-- <build>-->
<!-- <resources>-->
<!-- <!–<resource>-->
<!-- <directory>src/main/java/com/example/dao/mapper</directory>-->
<!-- <includes>-->
<!-- <include>**/*.xml</include>-->
<!-- </includes><!–excludes标签是不包括xx目录–>-->
<!-- <targetPath>com/example/dao/mapper</targetPath><!–打包默认的根目录是/Demo/target/classes/–>-->
<!-- </resource>–>-->
<!-- <resource>-->
<!-- <directory>src/main/resources</directory>-->
<!-- <includes>-->
<!-- <include>**/*</include>-->
<!-- </includes>-->
<!-- </resource>-->
<!-- <resource>-->
<!-- <directory>src/main/webapp/WEB-INF</directory>-->
<!-- <includes>-->
<!-- <include>**/*.xml</include>-->
<!-- </includes><!–excludes标签是不包括xx目录–>-->
<!-- </resource>-->
<!-- </resources>-->
<!-- </build>-->
</project>
a.pom.xml生效。
操作:左边目录pom.xml选中->右键->Maven->Reload Project (或者Ctrl+Shift+O)
可以看到External Libraries里面多了相关的包
b.pom.xml相关报错
1.报错:pom.xml的xmls部分添加依赖uri飘红报错 URI is not registered.
解决:a.点击File->Settings->Schemas and DTDs,点击下方"+"号,添加该uri即可。
b.鼠标点击红色字,出现小红灯,选择Fetch external resource即可。
2.报错:org.apache.jasper.JasperException: java.lang.NullPointerException
解决:这种都可能是包冲突,maven里面pom.xml生效时自动下载的servlet-api.jar或jsp-api.jar与tomcat自带的jar包冲突,删除maven依赖的相关包即可。
3.报错:mybatis Could not get JDBC Connection 或 nested exception is java.sql.SQLException: Unknown system variable 'query_cache_size'
解决:mysql-connector驱动版本还是过低,pom.xml里对应项版本改为8.0.11,pom.xml重新生效。
(2)web.xml
web.xml主要配置前端相关,比如默认打开页、DispatcherServlet前端总控等,该文件内部根目录为/webapp/。
<?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_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!--welcome pages-->
<welcome-file-list>
<welcome-file>/views/index.jsp</welcome-file><!--默认打开页-->
</welcome-file-list>
<!--配置springmvc DispatcherServlet-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- init-param 前端控制器的初始化参数-->
<init-param>
<!--配置dispatcher.xml作为mvc的配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<!--load-on-startup指定了前端控制器在服务器启动时就创建,
它的参数越小,代表创建的优先级越高 -->
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<!--一个servlet对应一个servlet-mapping-->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!--
这里指定url拦截范围
/*:范围更大,会拦截所有请求,包括jsp文件,所以不能保证jsp页面访问正常,可能会出现404
/ : 也是拦截所有请求,但是不会拦截*.jsp,也就是不会拦截jsp文件,可以保证页面访问正常
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置applicationContext.xml-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
(3)dispatcher-servlet.xml
这个文件负责整个MVC的配置,映射解析、注解驱动、ViewResolver及渲染页面前端根目录等。
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--此文件负责整个mvc中的配置-->
<!--启用spring的一些annotation注释 -->
<context:annotation-config/>
<!-- 配置注解驱动 可以将request参数与绑定到controller参数上,即@mapping映射 -->
<mvc:annotation-driven/>
<!--静态资源映射-->
<!--本项目把静态资源放在了webapp的statics目录下,资源映射如下-->
<mvc:resources mapping="/css/**" location="/statics/css/"/>
<mvc:resources mapping="/js/**" location="/statics/js/"/>
<mvc:resources mapping="/image/**" location="/statics/images/"/>
<mvc:default-servlet-handler />
<!--这句要加上,要不然可能会访问不到静态资源,
这个标签相当于在dispatcherServlet处理链上串联了一个java:org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler
静态资源处理类,每次请求过来,先经过该类判断是不是静态文件,是则自行处理,不是则交由DispatcherServlet控制器处理-->
<!-- ViewResolver视图解析器,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了),这里设置使用的是JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/views/"/><!--设置JSP文件的目录位置,controller里面的url访问的根目录 prefix前缀-->
<property name="suffix" value=".jsp"/><!--suffix后缀-->
<property name="exposeContextBeansAsAttributes" value="true"/><!--默认会话所传contextBeans即为属性?-->
</bean>
<!-- 自动扫描装配,保证把base-package里的注解对应bean扫描到 -->
<context:component-scan base-package="com.example.controller"/>
</beans>
(4)applicationContext.xml
这个文件配置非MVC组件,如需扫描成bean的xml文件(component-scan),其他需扫描的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 http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example"/>
<!--这个文件里是把注解解析成bean格式,bean可以由xml直接id property生成,也可以来自注解-->
<import resource="classpath:mybatis/mybatis-config.xml" />
<!--import进其他的xml文件-->
</beans>
4.报错:no bean named UserDao is defined
解决:配置声明了bean的某些xml文件没有被扫描上,需要在applicationContext.xml或者其他可扫描的xml文件里配置import resource该xml文件。
应该是WEB-INF里的web.xml是web机制(conf/context.xml)默认扫描的,然后web.xml配置了dispatcher-servlet.xml和applicationContext.xml路径,所以二者也可以被扫描到,但 是resources里面的xml虽然被打包到target里了,但未被扫描到。
---小知识点---
4.Spring Bean:
在Spring中,构成应用程序主干并由Spring LOC容器管理的对象称为bean,bean是一个由Spring LOC容器实例化、组装和管理的对象。
LOC:inversion of control控制反转,通过依赖注入的方式实现对象之间的松耦合关系。负责对象的生成和依赖的注入,对一个对象定义依赖关系而不创建它们,符合LOC的过程是 Person(Computer computer)对象依赖,而不是private computer=new Computer()或者非构造函数生成computer依赖类的实例
Spring控制类构建过程就不用new,,类的实例化、依赖的实例化、依赖的传入都由Spring Bean容器控制(控制反转)。
可以理解为bean管理类,一个bean的id就对应一个类,直接通过获取bean或者相关注解去得到对象。
bean容器,或称spring ioc容器,主要用来管理对象和依赖以及以来的注入;根据bean规范编写出来的类,并由bean容器生成的对象就是一个bean。
bean规范:所有属性为private;提供默认构造方法;提供getter和setter;实现serializable接口(序列成form)。
5.ApplicationContext:
ApplicationContext:是spring继BeanFactory之外的另一个核心接口或容器,
允许容器通过应用程序上下文环境创建、获取、管理bean。为应用程序提供配置的中央接口。
-bean调取-
ApplicationContext ctx = new ClassPathXmlApplicationContext("mybatis/mybatis-config.xml");
SqlSessionFactory factory=(SqlSessionFactory) ctx.getBean("sqlSessionFactory");
4.实例
(1)index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Index</title>
<!--<link rel="stylesheet" type="text/css" href="../statics/css/index.css">-->
</head>
<body>
<h2>views Demo success!</h2>
</body>
</html>
(2)404.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>404</title>
<!--<link rel="stylesheet" type="text/css" href="../statics/css/index.css">-->
</head>
<body>
<h2>404 not found!</h2>
</body>
</html>
(3)Controller/UserController.java
package com.example.controller;
import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
@Controller //controller注释代表这个类是个控制器
@RequestMapping("/user")//这里的RequestMapping注释指的是前端html的根路径
public class UserController {
//拦截到了浏览器或其他的访问url为http://127.0.0.1:8080/Demo/user/login则调用该方法
@RequestMapping("/login")//结合上面的/user,则html的form表单的action路径即为/user/login
public String login() {
if(true)
return "index";//返回的是url,对应/views/index页面(dispatcher-servlet.xml的viewresolver设置的)
else
return "404";//对应/views/404页面
}
}
更多jsp前后端传参、传对象、传list等参考https://blog.youkuaiyun.com/qq_41855420/article/details/104098542
5.tomcat运行
操作:a.run->Edit Configurations->tomcat server
b.File->settings->Plugins->搜索tomcat->勾选插件smart tomcat,installed(学生版或者社区版上面无tomcat server选项)
run->Edit Configurations->Smart Tomcat
configuration选择tomcat目录(是总目录而不是bin),tomcat name可以随便填。
run->tomcat 7.0.94运行(对应tomcat name),idea下方会出现一个build的进度条。
浏览器url栏输入http://127.0.0.1:8080/Demo/user/login即可访问到UserController(注解为/user)的注解为/login的方法,返回/views/index.jsp页面。
---小知识点---
6.快捷操作:
ctrl+shift+alt+L 美化代码
ctrl+D 复制选中区域或者复制当行
ctrl+/ 注释掉当行或者选中区域(区域的话是一行行注释掉的)
选中+alt+enter 可以impor相关类t或得到提示小灯泡
shift+shift(两下) 弹出查找框
ctrl+shift+O pom.xml生效
User或其他实体类里某个属性右键generate可以直接生成getter、setter方法