IntelliJ IDEA使用教程 (总目录篇)


使用这个IntelliJ IDEA创建一个简单的Java web maven项目,我在前面的文章里面已经示范过了。
地址:IntelliJ IDEA 创建 hello world Java web Maven项目从头到尾都有图有真相2017版本

主要是告诉你:
怎么使用IntelliJ IDEA编辑器;怎么自己新建tomcat服务器;怎么把服务器跑起来;
简单的了解一下什么是maven,什么是仓库,怎么配置仓库位置,如何使用国内的镜像仓库。等等吧。
那个算是最简单的框架啦,基本所有的web项目都是这么个套路,
现在,也就对那个简单的项目稍微扩展一下,带上springMVC框架,当然了,虽然带上了springMVC框架,也还是很简单的一个Java web maven项目。
九层之台,起于垒土。还是一步步学习,慢慢的来嘛。
至于前面的新建个web项目的步骤,我就不赘述了,跟前面那个简单web例子是一模一样的。
就说下不同的地方:
先看下面的2个项目的目录不同,除了你要新建这么几个目录以外,还得简单几步的设置。


请注意:

上图的右半部分是我们下面要创建的springMVC项目的超简单的项目的目录结构。和下面的那些个单独的文件是对应的上的。

之所以和左边的那个放在一起,是为了做对比,对比,这个springmvc项目,比之前那个自动生成的Java web项目之间的目录差别。

简单描述下目录结构:

有controller层,前台URL的映射关系,都在这个controller层处理。

有dao层,访问数据库,一般的crud都是在这写

有service层,一般的服务端的业务逻辑都是在service层,可以通用的方法都在这地方。

有前台页面views下面的都是前台页面的jsp,下面可以看到根据返回的ModelAndView类型,来绑定到对应的前台页面

有spring的配置spring-servlet.xml,spring配置相关的设置,扫描哪个目录下的文件注解等的设置

有web项目必备的web.xml 。。。。

有maven项目必备的pom.xml,存放的是项目所需的jar包依赖,以及项目打包所需的一些配置相关

有web项目必备的target文件夹,是项目打包自动生成的目录。

有test目录,这个也是项目的测试目录,一些测试代码就是在这文件夹下写的。



至于为什么这么做,看下面链接的解释:

IntelliJ IDEA 中 右键新建时,选项没有Java class的解决方法和具体解释

注意:

上面的那个必须看,不然你都不知道怎么新建个Java文件。设置一下所有的目录的不同功能。


好,准备工作就绪,那么就开干了。看代码,至于整个项目的目录结构,在上面的对比图里面已经看过了,这就不再重复上图啦。
大致看一下,整个简单的项目都用到了什么jar包,也就是了解下maven依赖。
最好看下上面说的那个简单Java web maven项目的那一篇文章,因为,里面说了如何使用国内的镜像仓库,maven下载jar包的时候,速度就快很多。
先是pom.xml文件,如下:

pom.xml文件中包含spring mvc依赖及为编写jsp文件提供支持的taglib相关依赖

<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 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>lxk</groupId> 
    <artifactId>springMVC</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>springMVC Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
 
    <properties> 
        <org.springframework-version>4.1.4.RELEASE</org.springframework-version> 
    </properties> 
 
    <dependencies> 
        <!-- Spring MVC support --> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-webmvc</artifactId> 
            <version>${org.springframework-version}</version> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-web</artifactId> 
            <version>${org.springframework-version}</version> 
        </dependency> 
 
        <!-- Tag libs support for view layer --> 
        <dependency> 
            <groupId>javax.servlet</groupId> 
            <artifactId>jstl</artifactId> 
            <version>1.2</version> 
            <scope>runtime</scope> 
        </dependency> 
        <dependency> 
            <groupId>taglibs</groupId> 
            <artifactId>standard</artifactId> 
            <version>1.1.2</version> 
            <scope>runtime</scope> 
        </dependency> 
 
        <!-- junit --> 
        <dependency> 
            <groupId>junit</groupId> 
            <artifactId>junit</artifactId> 
            <version>4.12</version> 
            <scope>test</scope> 
        </dependency> 
    </dependencies> 
 
 
    <build> 
        <finalName>springMVC</finalName> 
    </build> 
</project> 
因为这个项目太简单,所以,这个pom.xml文件里面的配置也很简单。可以参考下面链接的一篇文章了解到基本所有的标签的作用。
哎,不要嫌啰嗦,你可以全文搜索你要了解的标签,又不是让你全部看一遍。对不对嘛。我就不解释标签的作用啦。
pom.xml配置文件中所有标签及作用简单描述

因为我在之前,转载过一篇,关于springmvc的各个jar包之间的maven依赖关系,具体链接如下:

spring framework体系结构及内部各模块jar之间的maven依赖关系

上面的pom.xml文件里面引入的jar包依赖就有冗余。

此文中详细描述了各个jar包之间的依赖关系,那么,我上面的pom.xml里面对springmvc的依赖导入,就有一个是多余的啦,就那个spring-web,这个jar包啦。spring-webmvc这个jar包是依赖spring-web的,所以,maven会自动添加这个jar的,所以,你就不需要自己声明引入jar依赖啦。

前提是你知道他们之间的关系,你才知道哪个可以写,哪个不用写。一般我看到的,基本都是随意的引入,不需要考虑,那样的话,你的pom.xml文件里面的dependency标签会很多,起码,我看很多人在示范这个springmvc框架,构建项目的时候,pom文件可是相当可观的,估计自己都不知道引入那么多有啥用。

所以,你可以把上面的那个多余的jar包给删除了。项目还是会正常的跑起来的。


再看一下,所有依赖的jar包,都使用了些什么jar包。



下面就该web.xml文件的配置了(注意啦,这个自动生成的web.xml有点问题,看下面的修正。)

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://java.sun.com/xml/ns/javaee" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
         version="3.0"> 
    <display-name>Archetype Created Web Application</display-name> 
 
    <servlet> 
        <servlet-name>spring</servlet-name> 
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
        <init-param> 
            <param-name>contextConfigLocation</param-name> 
            <param-value>/WEB-INF/spring-servlet.xml</param-value> 
        </init-param> 
        <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>spring</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping> 
 
</web-app>

修正:

这个web.xml,那个头标签那,我原来使用的是这个项目生成后自带的,然后没注意,导致bug啦。

直接自动生成的是下面这个样子的,

<!DOCTYPE web-app PUBLIC 
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
        "http://java.sun.com/dtd/web-app_2_3.dtd" > 
 
<web-app id="WebApp_ID" version="2.4" 
         xmlns="http://java.sun.com/xml/ns/j2ee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>Archetype Created Web Application</display-name>

,这之后,就会在最后,访问那个获得学生的数据的页面的时候,就没数据。如下图。

修正结束。


在配置中设置spring-servlet.xml的路径

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
本来上面的这个是可以不用配置的,默认在/WEB-INF/自己找XXX--servlet.xml对应的配置文件xxx对应为servlet的名字,我们也可以如上自己指定,

然后是servlet.xml的配置内容。

<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:mvc="http://www.springframework.org/schema/mvc" 
       xmlns:context="http://www.springframework.org/schema/context" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
 
    <!-- 开启spring的扫描注入,使用如下注解 --> 
    <!-- @Component,@Repository,@Service,@Controller--> 
    <context:component-scan base-package="com.lxk"/> 
 
    <!-- 开启springMVC的注解驱动,使得url可以映射到对应的controller --> 
    <mvc:annotation-driven /> 
 
    <!-- 视图解析 --> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
        <property name="prefix" value="/WEB-INF/views/"/> 
        <property name="suffix" value=".jsp"/> 
    </bean> 
 
</beans>
<mvc:annotation-driven /> 这个默认就给容器注入了下面的2个bean,所以就不需要再次重复注入了
下面第一个行使得自动映射到对应的controller类上,再下一行是映射到方法上,缺一不可。
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
这个地方,有的人是不知道的。我看有的人的例子,这个地方就写重复啦。


配置基本完成,从发出请求到controller,然后处理完,得到数据之后,再返回到浏览器页面上,这么个流程。

先看controller的代码。

package com.lxk.controller; 
 
import com.lxk.service.StudentService; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 
 
import javax.annotation.Resource; 
 
/** 
 * Created by lxk on 2017/3/27 
 */ 
@Controller 
@RequestMapping("student") 
public class StudentController { 
 
    @Resource(name = "studentService") 
    private StudentService studentService; 
 
    //@ResponseBody(之前我因为加了这个注解,导致页面访问一直是406错误,注释了就好啦,具体为啥我暂时还不知道) 
    @RequestMapping(value = "/getAllStudent", method = RequestMethod.GET) 
    public ModelAndView getAllStudent() { 
        ModelAndView mav = new ModelAndView(); 
        mav.setViewName("studentDisplay"); 
        mav.addObject("students", studentService.getAllStudent()); 
        return mav; 
    } 
}

下面是我补充的,上面注释那行代码的原因。

SpringMVC ajax 请求报错:406 Not Acceptable 的解决办法 使用@ResponseBody注解

然后是service


package com.lxk.service; 
 
import com.lxk.dao.StudentDao; 
import com.lxk.model.Student; 
import org.springframework.stereotype.Service; 
 
import javax.annotation.Resource; 
import java.util.List; 
 
/** 
 * Created by lxk on 2017/3/27 
 */ 
@Service("studentService") 
public class StudentService { 
 
    @Resource(name = "studentDao") 
    private StudentDao dao; 
 
    public List<Student> getAllStudent() { 
        return dao.findAll(); 
    } 
}
然后是dao,这个地方,为了简单,没有去访问数据库,而是直接返回了个list集合。还请见谅。

package com.lxk.dao; 
 
import com.lxk.model.Student; 
import org.springframework.stereotype.Repository; 
 
import java.util.ArrayList; 
import java.util.List; 
 
/** 
 * Created by lxk on 2017/3/27 
 */ 
@Repository("studentDao") 
public class StudentDao { 
 
    public List<Student> findAll() { 
        List<Student> all = new ArrayList<Student>(); 
        all.add(new Student("1", "tom", 18, true)); 
        all.add(new Student("2", "cat", 28, true)); 
        all.add(new Student("3", "lxk", 18, true)); 
        all.add(new Student("4", "cms", 18, true)); 
        return all; 
    } 
}
最后,是我们使用的Java model bean的代码

package com.lxk.model; 
 
import java.io.Serializable; 
 
/** 
 * Created by lxk on 2017/3/27 
 */ 
public class Student implements Serializable { 
    private String id; 
    private String name; 
    private int age; 
    private boolean sex; 
 
 
    public Student() { 
    } 
 
    public Student(String id, String name, int age, boolean sex) { 
        this.id = id; 
        this.name = name; 
        this.age = age; 
        this.sex = sex; 
    } 
     
    getter and setter,直接复制代码的老铁,知道什么叫getter和setter吗?我为了省篇幅,这没写,我这句话不注释掉,你直接复制肯定报错。  
    ...... 
}
这地方有需要注意的地方:你重写了一个model bean的构造方法,那么他的无参构造函数就不见了,所以,你最好。
哦,不,为了省去不必要的麻烦,你必须给他加上默认的构造函数。因为,在这使用的简单,请求都是不带参数的。
项目复杂了,是会带model bean类型的参数的,那么可能就会因为对象初始化失败而报错。可能你排错都得整半天,都不知道错在哪,一直请求400错误码。

参考链接:ajax 报错 400 (Failed to load resource: the server responded with a status of 400 (Bad Request))

现在后台完事了,那么就该前台的jsp代码了,不要嫌弃,为什么还在使用jsp当前台,学习嘛。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 
 
<html> 
<head> 
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
	<title>Spring MVC Hello World</title> 
</head> 
 
<body> 
	<h2>All Students in System</h2> 
 
	<table border="1"> 
		<tr> 
			<th>Id</th> 
			<th>Name</th> 
			<th>Age</th> 
			<th>Sex</th> 
		</tr> 
		<c:forEach var="student" items="${students}"> 
			<tr> 
				<td>${student.id}</td> 
				<td>${student.name}</td> 
				<td>${student.age}</td> 
				<td>${student.sex}</td> 
			</tr> 
		</c:forEach> 
	</table> 
 
</body> 
</html>
这个jsp页面也是有个地方需要注意的,对就是乱码的问题。因为你不设置一下jsp页面的编码格式,汉字就会显示为???很多个问号。
我看其他人做测试的时候,都没遇到,也就不会考虑这个问题啦。因为湿胸我出过这个bug,所以,深切知道这个问题的重要性,
谁让计算机不是中国人发明的呢,所以,就会莫名其妙的出现编码问题的bug,比如我最近的编码bug就是log4j日志输出到文件所有汉字都变问号了。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
另外,jsp页面上使用的就是jstl标签啦。也就是个简单的foreach循环,雷同Java的foreach循环。简单理解一下就OK拉。


现在,前后台的代码,算是都敲完了,该配置个tomcat服务器,跑起来这个Java web项目。具体配制流程,我也不上图啦,我在此文一开始的时候,附的那个链接
详细的记录了如何配置启动一个tomcat。当你按照那个配置完成之后,直接启动tomcat,会跳到hello world页面,然后你再输入如下URL
http://localhost:8080/lxk/student/getAllStudent
就可以看到如下的执行结果啦。


至此,这个算是极其简单的spring mvc项目算是从头到尾的示范完了。遗憾的是,这个项目还是太简单了,还是么有使用到数据库,比如mongo DB。
也没有使用到JavaScript,jQuery,ajax,而且后台代码也是超级简单。也没有使用到配置文件,而且使用的前台页面也是不符合实际开发要求的。
所以,还是不行的。
所以,还是可以继续复杂起来的。路漫漫其修远兮吾将上下而求索。留待湿胸我慢慢整理吧。
虽然这一篇,还是水的不行。当然,还是希望各位,不嫌弃麻烦的,点个赞啥的。也是极好的。


后面我又多方试探,发现,pom.xml文件还是可以继续精简的。那个依赖可以直接只要下面2个依赖就可以了。

其他的都是多余的。

    <dependencies> 
        <!-- Spring MVC support --> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-webmvc</artifactId> 
            <version>${org.springframework-version}</version> 
        </dependency> 
 
        <!-- Tag libs support for view layer --> 
        <dependency> 
            <groupId>javax.servlet</groupId> 
            <artifactId>jstl</artifactId> 
            <version>1.2</version> 
            <scope>runtime</scope> 
        </dependency> 
 
    </dependencies>
就这2个jar包就够用了。

想不想看看,现在这个maven项目的所有jar包的依赖关系呢?

看图。


好,这个就是现在的修改过,去掉多余的jar包之后的maven jar 包依赖关系图。


注意:

理论上讲,你先创建个maven版本的Java web项目,我的文章开头的那个链接就是啦。那个创建完毕,你的就算是个web项目啦,当然,是个很简单的骨架级项目。

然后再根据这篇文章,把springmvc的东西添加进去。

理论上讲,是不建议使用我下面提供的云盘的源码的,参考倒是可以滴。


为了方便小伙伴们,我就把这个放在云盘上了,

链接:http://pan.baidu.com/s/1hrHhQoG 密码:edsf

当你下载下来之后,除了简单的配置下tomcat之后,

jdk相关的报错的,可以参考下面的几个设置jdk的地方的图

还有要配置几个jdk版本的地方。估计新手,不一定很快的搞定这个问题,我就再附上几张图。





有些是已经自动给设值了,但是也可能有些还得手动配置下。





发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Spring MVC 教程,快速入门,深入分析知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。