最基本springMVC,響應頁面請求

        前幾天整個最基本的MVC配置都弄了小半天,基礎仍是很弱,仍是花時間整理一下。javascript

        邏輯:頁面經過一個點擊事件訪問後臺接口,後臺返回一個數據給jsp,jsp彈出便可。css

        1.首先是在pom.xml中導入須要的依賴,spring的幾個基礎包加一個servlet和一個fastjson包html

        

 1     <dependency>
 2       <groupId>junit</groupId>
 3       <artifactId>junit</artifactId>
 4       <version>4.12</version>
 5       <scope>test</scope>
 6     </dependency>
 7 
 8     <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
 9     <dependency>
10       <groupId>org.springframework</groupId>
11       <artifactId>spring-core</artifactId>
12       <version>5.0.8.RELEASE</version>
13     </dependency>
14     <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
15     <dependency>
16       <groupId>org.springframework</groupId>
17       <artifactId>spring-context</artifactId>
18       <version>5.0.8.RELEASE</version>
19     </dependency>
20     <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
21     <dependency>
22       <groupId>org.springframework</groupId>
23       <artifactId>spring-webmvc</artifactId>
24       <version>5.0.8.RELEASE</version>
25     </dependency>
26     <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
27     <dependency>
28       <groupId>javax.servlet</groupId>
29       <artifactId>javax.servlet-api</artifactId>
30       <version>3.1.0</version>
31       <scope>provided</scope>
32     </dependency>
33 
34     <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
35     <dependency>
36       <groupId>com.alibaba</groupId>
37       <artifactId>fastjson</artifactId>
38       <version>1.2.47</version>
39     </dependency>

2.配置文件spring-context.xml,demo比較簡單,直接用一個xml,不分什麼spring-MVC.xml了java

  

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:mvc="http://www.springframework.org/schema/mvc"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans
 7        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 8        http://www.springframework.org/schema/context
 9        http://www.springframework.org/schema/context/spring-context-4.3.xsd
10        http://www.springframework.org/schema/mvc
11        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
12 
13 
14     <!-- 表示支持Spring的註解-->
15     <context:annotation-config/>
16     <!-- 表示支持MVC的註解-->
17     <mvc:annotation-driven/>
18     <!-- 表示放行靜態資源-->
19     <mvc:default-servlet-handler/>
20     <context:component-scan base-package="cn.test.controller"/>
21 
22     <!-- jsp頁面解析器,當Controller返回XXX字符串時,先經過攔截器,而後該類就會在/webapp/目錄下,查找XXX.jsp文件 -->
23     <bean
24     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
25     <property name="prefix" value="/"/>
26     <property name="suffix" value=".jsp"/>
27     </bean>
28 
29     <!-- 在向頁面返回一個json格式的數據時,會報 No converter found for return value of type: class com.alibaba.fastjson.JSONObject-->
30     <!-- 這裏轉換一下-->
31     <mvc:annotation-driven>
32         <mvc:message-converters register-defaults="false">
33             <!-- 避免IE執行AJAX時,返回JSON出現下載文件 -->
34             <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
35                 <property name="supportedMediaTypes">
36                     <list>
37                         <!-- 這裏順序不能反,必定先寫text/html,否則ie下出現下載提示 -->
38                         <value>text/html;charset=UTF-8</value>
39                         <value>application/json;charset=UTF-8</value>
40                     </list>
41                 </property>
42             </bean>
43         </mvc:message-converters>
44     </mvc:annotation-driven>
45 
46 </beans>
<!-- 表示支持Spring的註解-->
    <context:annotation-config/>
    <!-- 表示支持MVC的註解-->
    <mvc:annotation-driven/>
    <!-- 表示放行靜態資源-->
    <mvc:default-servlet-handler/>
由於在web.xml的DispatcherServlet中攔截的爲"/",也就是全部的請求都會被攔截,這樣會致使項目裏的一些靜態資源css,js,img等出現404的狀況,能夠在這裏配置,也能夠在
web.xml中配置,以放行靜態資源,在DispatcherServlet的mapping中加一個default
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.map</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.png</url-pattern>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
下面是須要掃描的controller,也就是將該包下的全部類交給spring進行管理,在對應的controller類上加上@controller註解,表示它是一個接口
<context:component-scan base-package="cn.test.controller"/>

最下面那段配置,是由於向頁面響應數據的時候報No converter found for return value of type: class com.alibaba.fastjson.JSONObject,fastjson轉springMVC報
轉換錯誤,加上那段配置解決。


3.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">
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:spring-context.xml
    </param-value>
  </context-param>
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>springServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
        classpath:spring-context.xml
      </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>  
1)監聽web容器啓動
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


在web.xml配置監聽器ContextLoaderListener(listener-class) 
ContextLoaderListener的做用就是啓動Web容器時,自動裝配ApplicationContext的配置信息。
由於它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啓動容器時,就會默認執行它實現的方法。
在ContextLoaderListener中關聯了
ContextLoader這個類,因此整個加載配置過程由ContextLoader來完成.它的API說明:

第一段說明ContextLoader能夠由 ContextLoaderListener和ContextLoaderServlet生成。若是查看ContextLoaderServlet的API,
能夠看到它也關聯了ContextLoader這個類並且它實現了HttpServlet這個接口 ,第二段,ContextLoader建立的是 XmlWebApplicationContext這樣一個類,
它實現的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->
BeanFactory這樣一來spring中的全部bean都由這個類來建立
2)  裝載配置信息
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-context.xml </param-value> </context-param>


<!--若是在web.xml中不寫任何參數配置信息,默認的路徑是"/WEB-INF/applicationContext.xml,  
在WEB-INF目錄下建立的xml文件的名稱必須是applicationContext.xml。  
若是是要自定義文件名能夠在web.xml里加入contextConfigLocation這個context參數:  
在<param-value> </param-value>裏指定相應的xml文件名,若是有多個xml文件,能夠寫在一塊兒並以「,」號分隔。  
也能夠這樣applicationContext-*.xml採用通配符,好比這那個目錄下有applicationContext-ibatis-base.xml,  
applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都會一同被載入。  
在ContextLoaderListener中關聯了ContextLoader這個類,因此整個加載配置過程由ContextLoader來完成。-->
這裏導入配置文件spring-context.xml
3)字符編碼過濾器
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

字符編碼過濾器,這個過濾器是針對於瀏覽器每次請求進行過濾的
4)DispatcherServlet
  <servlet>
    <servlet-name>springServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
        classpath:spring-context.xml
      </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
程序的入口,全部的請求都會通過dispatchServlet進行處理,若是與後臺controller能匹配則經過,不然不經過。<load-on-startup>1</load-on-startup>表示
讓dispatchServlet與Tomcat容器一塊兒啓動。

4.後臺接口controller
 1 package cn.test.controller;
 2 
 3 
 4 import com.alibaba.fastjson.JSONObject;
 5 import org.springframework.stereotype.Controller;
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 import org.springframework.web.bind.annotation.ResponseBody;
 8 
 9 import javax.servlet.http.HttpServletRequest;
10 
11 @Controller
12 @RequestMapping("/test")
13 public class SpringController {
14     @RequestMapping("/index")
15     @ResponseBody
16     public JSONObject index(HttpServletRequest request){
17         String username = request.getParameter("username");
18         String password ="123456";
19         JSONObject jsonObject = new JSONObject();
20         jsonObject.put("password",password);
21         return jsonObject;
22     }
23 }

加上@ResponseBody註解,向頁面返回json格式的響應數據jquery

5.jspweb

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <body>
 4 <h2>Hello World!</h2>
 5 <%--<form action="/test/index">--%>
 6     <%--<input type="text" value="username" name="username">--%>
 7     <button id="bird">你個傻鳥!!!</button>
 8 <%--</form>--%>
 9 
10 <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
11 <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.11.1.min.js"></script>
12 <script>
13      $("#bird").click(function () {
14          $.ajax({
15              url:"/test/index",
16              data:{
17                  username:"yang",
18              },
19              dataType:"json",
20              success:function (data) {
21                  alert(data.password);
22              }
23             })
24      })
25 </script>
26 </body>
27 </html>

到此就結束了,點擊你個傻鳥按鈕,頁面將彈出"123456"。ajax

由於用的ajax請求,ajax是不支持重定向的,若是請求成功後要跳轉到一個頁面,能夠在ajax的success函數裏進行跳轉。spring

或者使用表單提交數據,訪問<form>標籤中的action,再這後臺進行跳轉頁面,去掉@responseBody註解,返回視圖名字,通過spring.xml中配置的視圖解析器便可。json

項目打包時,默認是項目名+版本號,要去除版本號的話能夠在pom.xml中加上api

<finalName>customAct</finalName>在build標籤中加入便可。有不對的地方,歡迎你們批評指着,謝謝。文章web.xml中配置的一些講解,參考這篇博客,寫的比較詳細,感興趣的能夠去看https://www.cnblogs.com/wkrbky/p/5929943.html
相關文章
相關標籤/搜索