Java 21:Spring 4(Intelij IDEA下的SpringMVC环境搭建)

来源:互联网 发布:天津相声广播网络直播 编辑:程序博客网 时间:2024/06/09 23:13

最近又开始学习Java Web,其实之前已经实习做过几个月相关工作,当时用的是SSH进行了几个月ERP软件的开发,感觉最难的还是前期学的时候,各种不知道怎么搭建环境,书上的、网上的代码也基本不能直接跑通,当时自己搭SSH花了一周多,最后的原因居然是有个Spring的包漏掉了(我是把下载的Spring资料里lib所有的JAR放进去,结果没想到还有一些JAR不在lib里,在其他目录里,很郁闷)

然后最近买了本《Spring实战》,看起来不错,但是照着敲代码又让我郁闷了,按着上面的纯Java注解的方式敲出来没反应(书上代码居然还有个别拼写错误)。。。也没报错,看网上也有一些人是同样的问题,都是这本书,也没个解法,瞬间对这本书失去了信心,还是回归大众化的XML配置方式了。

然后干脆直接从Eclipse换到Intelij IDEA了,感觉后面应该用得更多。


IDEA要比Eclipse智能很多,也更让人眼花缭乱,虽然智能,但是直接建的工程也没能直接跑成功。。。。

建立一个工程,选择Spring MVC



发现确实智能,web.xml和分发器和spring上下文的xml都帮我们建好了,web.xml内容都填好了

这里需要改一下web.xml的内容,

<servlet-mapping>        <servlet-name>dispatcher</servlet-name>        <url-pattern>/</url-pattern>//这个地方改成/,默认接收一切请求    </servlet-mapping>
其他不用改,在有index.jsp的情况下直接在Tomcat下运行即可

然后运行我就遇到了错误,它说找不到Spring的什么ContextLoaderListener的Class,你不是创项目的时候都帮我下载好了么,现在报什么错?!

搞了一整天才发现这么改:File——Project Structure——Artifact里

看到中间部分一左一右分别是<output root>和Springmvc6,然后左边的这部分WEB-INF的lib里面是没有东西的,但我们项目路径下也确实有所有的Spring的lib,

这时候我已经修改完了,再我没改的时候,最下面会报一个错,并有fix的可以按,意思就是在XXX里面找不到Spring的lib,是否从项目导入一下,fix一下,然后fix了两次,那个提示消失了。我们的左边<output root>下的lib里也多了两个Spring的库,这时候,Apply——OK——运行,就可以进入index.jsp,也没有报错了


在WEB-INF下建文件夹叫jsp,里面创建一个hello.jsp,内容如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>${msg}</title></head><body><h1>${msg}</h1><span>${name}</span></body></html>
在src下面建立包叫controller,里面放一个HelloController的Java类,代码如下:

@Controller@RequestMapping(value = "/hello", method = RequestMethod.GET)public class HelloController {    @RequestMapping(value = "/hello", method = RequestMethod.GET)    public String hello(ModelMap model) {        model.addAttribute("msg", "Spring MVC Hello World");        model.addAttribute("name", "yuntao");        return "hello";    }}
这个代码对于model的操作就是对应jsp里的msg和name,如果一点都不懂标签,可以吧JSP里的两个换成普通字符串,Java里hello除了return “hello”啥都不干,这里稍微解释一下吧,虽然我也没深入研究

@Controller说明自己是控制器,第一个RequestMapping说明整个类处理/hello的消息,加上下面hello方法前面的RequestMapping,说明处理url为/hello下的/hello,大家可能知道,我什么都不干的情况下,打开Tomcat默认的界面跳到localhost:8080,有index.jsp会进入index。加上这两个RequestMapping,也就是说我们的HelloController类的hello方法是专门处理localhost:8080/hello/hello这个请求的,然后返回了hello,意思就是返回hello.jsp给用户

当然这里为了1、能够使用@的注解,2、能够让代码去扫描我们这个类,3、能够知道返回的是jsp,4、能够知道处理的url格式。。。。。都是需要在xml里有相关配置的,你可以自己找找对应关系


在web.xml我们已经有了以下代码(因为是Intelij自动生成的,所以我这里不全贴出来,只捡一部分说)

<servlet>        <servlet-name>dispatcher</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <load-on-startup>1</load-on-startup>    </servlet>
默认会去找dispather-servlet.xml的配置文件,该文件IDEA早已帮我们建立好了,但是没有具体代码,下面是具体添加的,这个xml的名称和上面的servlet-name对应,不能随便改的:

dispather-servlet.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"       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">    <context:component-scan base-package="controller"/>          <!-- 对应HelloController所在的包名 -->       <!-- 静态资源(js、image等)的访问 -->    <mvc:default-servlet-handler/>    <!-- 开启注解 -->    <mvc:annotation-driven/>        <!--ViewResolver 视图解析器-->    <!--用于支持Servlet、JSP视图解析-->    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>        <property name="prefix" value="/WEB-INF/jsp/"/>        <property name="suffix" value=".jsp"/>    </bean></beans>


applicationContext.xml作为Spring的上下文,我们先不管,直接运行,这时候如果有index.jsp会进入,前提是xml没有语法错误,Tomcat也能正常运行。

但是我们把url改成localhost:8080/hello/hello就报错了,因为我们上面的Java里使用了model,jsp里使用了${name},这个需要jstl标签库支持,我直接将jstl的JAR拷贝到项目文件夹下的lib里,IDEA里立刻就能识别到,但是奇怪的是,这是JSTL库前面是没有+加号的,运行也还是同样的错误(下面已经解决了, 有了+)


File——Project Structure——Libraries——选添加。在文件夹中选中jstl,添加,然后发现jstl左边也有了+,才算真正引用进来了


然后在运行,就可以正常打开hello.jsp了



有了jsp(view),有了model(model模型),HelloController(控制器),基本的MVC也就搭建好了


—————————————————————————————————————————————————


最近换了mac,又在mac搭建同样的环境,结果又报类似的错,我就不知道这算IDEA还是Tomcat的锅。这次的错和前面的不同,而且mac下和windows下界面也有不同,所以也是鼓捣了一个小时,才搞完。

报的错:Error during artifact deployment,中间还有个错是tomcat下duplicate context path /,也不知道是啥问题,我也没干啥呀。还以为遇到什么新错误


然后看输出文件是看不出啥了,不过他下面提醒你去看tomcat的日志文件:一看就在输出旁边,还挺好的


然后这边的错就很直观了,说找不到ContextLoaderListener,但这个类lib是有了,就是tomcat没有识别,鼓捣了半天,在file——Project Structure里,下面图里的右下方,选择fix,把所有missing的都fix上,然后就成功打开了


这时候直接打开8080是可以进去index.jsp的,但是一到前面的hello.jsp,又报了jstl错误,只能在手动下载jstl,上面一张图的Libraries里导入。。。。终于,又成功了!