Day69 Spring MVC 概念及其配置方式、Springmvc單元方法獲取請求資料

神一樣的我發表於2018-05-10

springmvc的概念介紹

SpringMVC的概念介紹:
    問題:
        當前:Servlet+Spring+mybatis+jsp
        Servlet的缺點:
            必須由程式設計師自己進行業務分配流轉程式碼編寫。
            發現使用Servlet進行請求處理時,必須手動獲取請求引數。
        Servlet使用流程
            //獲取操作符
            //判斷執行方法
            //獲取請求資料
            //處理請求資料
            //響應處理結果
    解決:
        Spring MVC
    使用:
        Spring MVC和Spring的關係
            SpringMVC是Spring的子容器。
            注意:SpringMVC和Spring在使用時,需要各自宣告配置檔案。 
        SpringMVC的使用
            配置方式一:
            配置方式二:
            SpringMVC獲取請求資料:            
            SpringMVC的響應:
            SpringMVC實現上傳下載:
            SpringMVC的攔截器:
            SpringMVC的執行原理:

SpringMVC配置方式

配置方式一:
    1 匯入jar包
        Spring和Mybatis的所有Jar包
        SpringMVC.Jar包
    2 配置SpringMVC封裝的Servlet
        <servlet>
            <servlet-name>springmvc123</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc123</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
        注意:
            此種配置方式Servlet一旦被載入,預設會到WEB-INF下找配置檔案。並且配置檔名預設為:
            <servlet-name>-servlet.xml
    3 在web-INF下配置springmvc的配置檔案 
            建立:springmvc123-servlet.xml
            配置:
                載入Schema
                配置註解掃描
                配置mvc驅動解析器
    4 在SRC下建立包(com.bjsxt.controller)
        在包下建立普通java類(控制器)
            在類中宣告方法(單元方法)
                在方法上使用@RequestMapping("值"),宣告方法別名,便於DispatcherServlet查詢。
配置方式二:
    1 匯入jar包
        Spring和Mybatis的所有Jar包
        SpringMVC.Jar包
    2 配置SpringMVC封裝的Servlet
        <!-- 配置SpringMVC的Servlet -->
        <servlet>
            <servlet-name>springmvc123</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--配置springmvc的配置檔案路徑  -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc123</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        注意:
            /代表攔截除jsp請求以外的所有請求。
                需要對靜態資源進行放行。
                <!--配置靜態資源方式  -->
          <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
        <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
        <mvc:resources location="/image/" mapping="/image/**"></mvc:resources>
            /*會攔截所有的請求包括jsp請求
    3 在web-INF下配置springmvc的配置檔案 
            建立:springmvc123-servlet.xml
            配置:
                載入Schema
                配置註解掃描
                配置mvc驅動解析器
    4 在SRC下建立包(com.bjsxt.controller)
        在包下建立普通java類(控制器)
            在類中宣告方法(單元方法)
                在方法上使用@RequestMapping("值"),宣告方法別名,便於DispatcherServlet查詢。
------------------------------------------------------------------------------------------------------------------------------------------------------------
    基本訪問流程:
        請求傳送
                  ------------>DispatcherServlet
                根據請求的URI資訊查詢對應的單元方法
                獲取請求資料
                呼叫單元方法執行
                接收單元方法的返回值
                根據返回值進行請求轉發或者重定向
                ----------------------->controller
                        宣告的單元方法
                        處理請求
                            呼叫業務層
                        返回處理結果





Springmvc單元方法獲取請求資料

Springmvc單元方法中獲取請求資料:
    建立基礎執行環境
        匯入jar包
            SpringIOC
            SpringAOP
            Spring TX   
            Spring 整合mybatis
            mybatis的jar
            Springmvc的jar
             jackSon的jar
            資料庫jar
        配置web.xml
            配置Springmvc提供的servlet
        在src下建立配置檔案
            springmvc.xml
                載入Schema
                配置註解掃描
                配置解析器驅動
                配置靜態資源放行
        在src下建立控制器
        在控制器中完成請求處理
-----------------------------------------------------------------------------
獲取請求資料:
    緊藕方式:
        使用原生的request物件進行獲取資料。
        在單元控制方法上直接宣告request形參即可。
    解耦方式:
        基本變數方式
        物件方式
        同名不同值資料
        restful
        ajax請求





Spring接收引數的例子


@Controller
public class TestCon {
    /**
     * 緊藕方式:
     *      使用原生的request物件獲取
     *      在單元方法上宣告HttpServletRequest形參即可
     *      在方法內使用req.getParameter("鍵名")  獲取資料即可
     * @return
     */
    @RequestMapping("show")
    public String demo(HttpServletRequest req){ 
        String uname=req.getParameter("uname");
        int age=Integer.parseInt(req.getParameter("age"));
        System.out.println("TestCon.demo(緊藕方式:)"+uname+age);
        return "a.jsp";
    }

    /**
     * 解耦藕方式一:使用基本型別形參獲取請求資料
     *      在單元方法上直接使用形參進行宣告。
     *      Servlet在呼叫單元方法時會自動給形參賦值。
     *      問題:
     *          預設使用形參名即請求資料的鍵名規則進行形參賦值。如果形參和請求鍵名不匹配,則報錯。
     *      解決:
     *          可以給形參使用別名@RequestParam(value="請求鍵名")
     *      @RequestParam的其他屬性:
     *              defaultValue="預設值"。當請求中沒有對應的資料時,給預設值。
     *              required="true" true表示該形參必須有請求資料的賦值。 false表示可有可無。
     *          
     * @return
     */
    @RequestMapping("show1")
    public String demo1(@RequestParam(value="uname",defaultValue="aaa") String uname1,int age){ 
        System.out.println("TestCon.demo(解耦藕方式一:使用基本型別形參獲取請求資料)"+uname1+age);
        return "a.jsp";
    }


    /**
     * 解耦藕方式二:使用引用型別形參獲取請求資料
            使用:在形參中宣告引用型別物件(實體類),Servlet會按照
                 屬性名和鍵名一致的規則,自動將請求資料注入到實體類物件中。
                 並將此物件作為實參傳遞給單元方法。
            注意:
                物件的屬性名和請求資料的鍵名要一致。
     *          
     * @return
     */
    @RequestMapping("show2")
    public String demo2(User u){    
        System.out.println("TestCon.demo(解耦藕方式二:使用引用型別形參獲取請求資料)"+u.getUname()+":"+u.getAge());
        return "a.jsp";
    }

    /**
     * 解耦藕方式三:獲取同鍵不同值的請求資料
     *          在單元方法上宣告ArrayList型別集合形參
     *          必須使用別名據)@RequestParam("鍵名") 
     * @return
     */
    @RequestMapping("show3")
    public String demo3(@RequestParam("fav")ArrayList<String> fav){ 
        System.out.println("TestCon.demo(解耦藕方式三:獲取同鍵不同值的請求資料)"+fav.get(0));
        return "a.jsp";
    }

    /**
     * 解耦藕方式四:使用restful方式獲取資料
     *      restful是請求資料的書寫格式。
     *          格式為:方法別名/資料/資料/../..
     *      後臺獲取資料方法別名格式:
     *          @RequestMapping("方法別名/{佔位鍵名}/{佔位鍵名}/../..")
     *      方法的形參宣告使用註解@PathVariable表示獲取請求路徑上的資料。
     *      注意:
     *          形參名和佔位名一致。
     * @return
     */
    @RequestMapping("show4/{name}/{age}")
    public String demo4(@PathVariable String name,@PathVariable int age){   
        System.out.println("TestCon.demo(解耦藕方式四:使用restful方式獲取資料)"+name+":"+age);
        return "a.jsp";
    }


    /**
     * 解耦藕方式五:Ajax請求
     *   1 前端ajax程式碼不變,請求地址變為單元方法別名即可
     * 
     *  前提:
     *      匯入jackson相關jar包
     *      在單元方法的@RequestMapping("show5")註解下使用@ResponseBody註解,將返回值轉換為Json      
     *   2 後臺處理程式碼可以直接返回查詢到的java物件,不用再轉換為Json格式的字串了。
     * @return
     */
    @RequestMapping("show5")
    @ResponseBody
    public User demo5(String uname,int age){    
        System.out.println("TestCon.demo(解耦藕方式五:Ajax請求)"+uname+":"+age);
        User  u=new User("李四",20);
        return u;
    }








}

增加的web.xml和spingmvc.xml

增加Jar包:jackSon 3個 作用:將java物件轉換成js物件

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" id="WebApp_ID" version="3.0">
  <!--配置spring  -->
      <!--配置applicationContext,xml的路徑  -->
  <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
     <!--配置監聽器  -->
  <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
  <!--配置SpringMVC 的servlet  -->
  <servlet>
    <servlet-name>servlet123</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置Spring MVC 的配置檔案路徑  -->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>servlet123</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>


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
        http://www.springframework.org/schema/beans/spring-beans.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.xsd">
        <!--配置註解掃描  -->
        <context:component-scan base-package="com.bjsxt.controller"></context:component-scan>
        <!--配置mvc註解驅動  -->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!--配置靜態資源方式  -->
        <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
        <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
        <mvc:resources location="/image/" mapping="/image/**"></mvc:resources>
        </beans>

小案例

需求:
這裡寫圖片描述

需要:資料庫:
2個表:
news表:
CREATE TABLE news (
id int(10) NOT NULL,
title varchar(100) NOT NULL,
content varchar(100) NOT NULL,
cid int(10) NOT NULL,
PRIMARY KEY (id),
KEY cid (cid),
CONSTRAINT cid FOREIGN KEY (cid) REFERENCES news_clazz (cid) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
news_clazz表:
CREATE TABLE news_clazz (
cid int(10) NOT NULL AUTO_INCREMENT,
cname varchar(100) NOT NULL,
PRIMARY KEY (cid)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

匯入相關jar包:
aopalliance.jar
asm-3.3.1.jar
aspectjweaver.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
commons-logging-1.1.3.jar
jackson-annotations-2.4.0.jar
jackson-core-2.4.1.jar
jackson-databind-2.4.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-rc1.jar
log4j-core-2.0-rc1.jar
mybatis-3.2.7.jar
mybatis-spring-1.2.3.jar
mysql-connector-java-5.1.30.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
spring-aop-4.1.6.RELEASE.jar
spring-aspects-4.1.6.RELEASE.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-webmvc-4.1.6.RELEASE.jar

src:
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:aop="http://www.springframework.org/schema/aop"
     xmlns:context="http://www.springframework.org/schema/context"
      xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        "
        default-autowire="byName"
        >

        <!--配置註解掃描  -->
        <context:component-scan base-package="com.bjsxt.serviceImpl,com.bjsxt.pojo"></context:component-scan>
        <!--配置代理模式為cglib  -->
        <aop:aspectj-autoproxy proxy-target-class="true" ></aop:aspectj-autoproxy>
        <!--配置資料來源檔案掃描  -->
        <context:property-placeholder location="classpath:db.properties"/>
        <!--配置資料來源  -->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        </bean>
        <!--配置工廠  -->
        <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"></bean>
        <!--配置mapper包掃描  -->
       <bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <property name="basePackage" value="com.bjsxt.mapper"></property>
       <property name="sqlSessionFactoryBeanName" value="factory"></property>
       </bean>
       <!--配置事務  -->
         <!--配置事務Bean  -->
         <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"></bean>
         <!--配置事務管理辦法  -->
         <tx:advice id="advice" transaction-manager="transactionManager">
         <tx:attributes>
         <tx:method name="ins*"/>
         <tx:method name="del*"/>
         <tx:method name="up*"/>
         <tx:method name="sel*" read-only="true"/>
         </tx:attributes>
         </tx:advice>
         <!--配置相關事件  -->
         <aop:config>
         <aop:pointcut expression="execution(* com.bjsxt.serviceImpl.*.*(..))" id="my"/>
         <aop:advisor advice-ref="advice" pointcut-ref="my"/>
         </aop:config>
         <!--配置切面  -->
            <!--配置切點bean  -->
            <!--配置通知bean  -->
            <!--織入形成切面  -->
         <!--配置其他bean  -->
        </beans>

db.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

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
        http://www.springframework.org/schema/beans/spring-beans.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.xsd">
        <!--配置註解掃描  -->
        <context:component-scan base-package="com.bjsxt.controller"></context:component-scan>
        <!--配置mvc註解驅動  -->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!--配置靜態資源方式  -->
        <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
        <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
        <mvc:resources location="/image/" mapping="/image/**"></mvc:resources>
        </beans>

com.bjsxt.controller:
NewsController.java:

package com.bjsxt.controller;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bjsxt.pojo.News;
import com.bjsxt.pojo.PageInfo;
import com.bjsxt.service.NewsService;
import com.bjsxt.serviceImpl.NewsServiceImpl;

@Controller
public class NewsController {
    //獲取業務層物件
    @Resource
    private  NewsServiceImpl newsServiceImpl;
    @RequestMapping
    @ResponseBody
    public PageInfo show(@RequestParam(defaultValue="1")int pageNum,@RequestParam(defaultValue="2")int pageSize){
        PageInfo p= newsServiceImpl.getPageInfo(pageNum, pageSize);
        return p;
    }
}

com.bjsxt.mapper:
NewsMapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  <mapper namespace="com.bjsxt.mapper.NewsMapper">
  <!--查詢新聞資訊  -->
  <resultMap type="com.bjsxt.pojo.News" id="n">
  <id column="id" property="id"/>
  <result column="title" property="title"/>
  <result column="content" property="content"/>
  <result column="cid" property="cid"/>
  <association property="nc" javaType="com.bjsxt.pojo.News_clazz">
  <id  column="cid" property="cid"/>
  <result column="cname" property="cname"/>
  </association>
  </resultMap>
  <select id="sel" resultMap="n">
    select n.id,n.title,n.content,nc.cname from news  n
    join news_clazz nc
    on n.cid=nc.cid   limit #{pageStart},#{pageSize}
  </select>
  <!--查詢新聞條數  -->
  <select id="selCount" resultType="int">
  select count(*) from news 
  </select>
  </mapper>

NewsMapper.java:

package com.bjsxt.mapper;

import java.util.List;

import com.bjsxt.pojo.News;
import com.bjsxt.pojo.PageInfo;

public interface NewsMapper {
    //查詢新聞資訊
    List<News> sel(PageInfo  pageInfo);
    //查詢新聞總條數
    int  selCount();
}

com.bjsxt.pojo:
News.java:

package com.bjsxt.pojo;

public class News {
  private int id;
  private String title;
  private String content;
  private int cid;
  private News_clazz nc;
public News() {
    super();
    // TODO Auto-generated constructor stub
}
public News(int id, String title, String content, int cid, News_clazz nc) {
    super();
    this.id = id;
    this.title = title;
    this.content = content;
    this.cid = cid;
    this.nc = nc;
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getContent() {
    return content;
}
public void setContent(String content) {
    this.content = content;
}
public int getCid() {
    return cid;
}
public void setCid(int cid) {
    this.cid = cid;
}
public News_clazz getNc() {
    return nc;
}
public void setNc(News_clazz nc) {
    this.nc = nc;
}
@Override
public String toString() {
    return "News [id=" + id + ", title=" + title + ", content=" + content + ", cid=" + cid + ", nc=" + nc + "]";
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + cid;
    result = prime * result + ((content == null) ? 0 : content.hashCode());
    result = prime * result + id;
    result = prime * result + ((nc == null) ? 0 : nc.hashCode());
    result = prime * result + ((title == null) ? 0 : title.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    News other = (News) obj;
    if (cid != other.cid)
        return false;
    if (content == null) {
        if (other.content != null)
            return false;
    } else if (!content.equals(other.content))
        return false;
    if (id != other.id)
        return false;
    if (nc == null) {
        if (other.nc != null)
            return false;
    } else if (!nc.equals(other.nc))
        return false;
    if (title == null) {
        if (other.title != null)
            return false;
    } else if (!title.equals(other.title))
        return false;
    return true;
}


}

News_clazz.java:

package com.bjsxt.pojo;

public class News_clazz {
    private int cid;
    private String cname;
    public News_clazz() {
        super();
        // TODO Auto-generated constructor stub
    }
    public News_clazz(int cid, String cname) {
        super();
        this.cid = cid;
        this.cname = cname;
    }
    public int getCid() {
        return cid;
    }
    public void setCid(int cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    @Override
    public String toString() {
        return "News_clazz [cid=" + cid + ", cname=" + cname + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + cid;
        result = prime * result + ((cname == null) ? 0 : cname.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        News_clazz other = (News_clazz) obj;
        if (cid != other.cid)
            return false;
        if (cname == null) {
            if (other.cname != null)
                return false;
        } else if (!cname.equals(other.cname))
            return false;
        return true;
    }

}  

PageInfo.java:

package com.bjsxt.pojo;

import java.util.List;

import org.springframework.stereotype.Component;
@Component
public class PageInfo {
  private int pageNum;
  private int pageSize;
  private int pageStart;
  private int count;
  private int pages;
  private List<News> ln;
public PageInfo() {
    super();
    // TODO Auto-generated constructor stub
}
public PageInfo(int pageNum, int pageSize, int pageStart, int count, int pages, List<News> ln) {
    super();
    this.pageNum = pageNum;
    this.pageSize = pageSize;
    this.pageStart = pageStart;
    this.count = count;
    this.pages = pages;
    this.ln = ln;
}
public int getPageNum() {
    return pageNum;
}
public void setPageNum(int pageNum) {
    this.pageNum = pageNum;
}
public int getPageSize() {
    return pageSize;
}
public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
}
public int getPageStart() {
    return pageStart;
}
public void setPageStart(int pageStart) {
    this.pageStart = pageStart;
}
public int getCount() {
    return count;
}
public void setCount(int count) {
    this.count = count;
}
public int getPages() {
    return pages;
}
public void setPages(int pages) {
    this.pages = pages;
}
public List<News> getLn() {
    return ln;
}
public void setLn(List<News> ln) {
    this.ln = ln;
}
@Override
public String toString() {
    return "PageInfo [pageNum=" + pageNum + ", pageSize=" + pageSize + ", pageStart=" + pageStart + ", count=" + count
            + ", pages=" + pages + ", ln=" + ln + "]";
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + count;
    result = prime * result + ((ln == null) ? 0 : ln.hashCode());
    result = prime * result + pageNum;
    result = prime * result + pageSize;
    result = prime * result + pageStart;
    result = prime * result + pages;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    PageInfo other = (PageInfo) obj;
    if (count != other.count)
        return false;
    if (ln == null) {
        if (other.ln != null)
            return false;
    } else if (!ln.equals(other.ln))
        return false;
    if (pageNum != other.pageNum)
        return false;
    if (pageSize != other.pageSize)
        return false;
    if (pageStart != other.pageStart)
        return false;
    if (pages != other.pages)
        return false;
    return true;
}

}

com.bjsxt.service:
NewsService.java:

package com.bjsxt.service;

import java.util.List;

import com.bjsxt.pojo.News;
import com.bjsxt.pojo.PageInfo;

public interface NewsService {
    //獲取所有新聞資料並分頁
    PageInfo getPageInfo(int pageNum,int pageSize);

}

com.bjsxt.serviceImpl:
NewsServiceImpl.java:

package com.bjsxt.serviceImpl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import com.bjsxt.mapper.NewsMapper;
import com.bjsxt.pojo.News;
import com.bjsxt.pojo.PageInfo;
import com.bjsxt.service.NewsService;
@Service
public class NewsServiceImpl implements NewsService{
    //建立mapper物件
    @Resource
    private  NewsMapper newsMapper;
    //建立pageInfo物件
    @Resource
    private PageInfo pageInfo;
    //查詢所有的新聞資訊並分頁顯示

    @Override
    public PageInfo getPageInfo(int pageNum, int pageSize) {
        //轉換pageStart
        int pageStart=pageNum*pageSize-pageSize;
        //給引數賦值
        pageInfo.setPageNum(pageNum);
        pageInfo.setPageSize(pageSize);
        pageInfo.setPageStart(pageStart);
        //獲取資料
        pageInfo.setLn(newsMapper.sel(pageInfo));
        int count=newsMapper.selCount();
        int pages=(int) Math.ceil(count*1.0/pageSize);
        pageInfo.setPages(pages);
        pageInfo.setCount(count);
        return pageInfo;
    }



}

WebContent:
js:1.9js
WEB-INF:
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" id="WebApp_ID" version="3.0">

  <!--配置applicationContext,xml的路徑  -->
  <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!--配置監聽器  -->
  <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
  <!--配置SpringMVC 的servlet  -->
  <servlet>
    <servlet-name>servlet123</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置Spring MVC 的配置檔案路徑  -->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>servlet123</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

news.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>show my news</title>
<style type="text/css">
a:hover{
    color:red
}
</style>
<script type="text/javascript" src="js/j.js"></script>
<script type="text/javascript">
 $(function(){
     //宣告總頁數
       var pages;
     //宣告當前頁碼數
      var pn;
     getData(1,2);
     //上一頁
      $("#up").click(function(){
          if(pn>1){
              getData(pn-1,2); 
          }else{
              alert("已經是第一頁")
          }

      })
     //下一頁
      $("#down").click(function(){
         if(pn<pages){
             getData(pn+1,2);
         }else{
             alert("已經是最後一頁")
         }
      })
     //封裝ajax分頁
     function getData(pageNum,pageSize){
         $.get("show",{pageNum:pageNum,pageSize:pageSize},function(data){
              //獲取table
              var ta= $("#ta");
              pn=data.pageNum;
              pages=data.pages;
              //清空表頭
              ta.empty();
              ta.append("<tr>"+
                        "<td>新聞標題</td>"+
                        "<td>新聞內容</td>"+
                        "<td>新聞類</td>"+
                    "</tr>");
              //填充內容
              for(var i=0;i<data.ln.length;i++){
                  ta.append("<tr>"+
                "<td>"+data.ln[i].title+"</td>"+
                "<td>"+data.ln[i].content+"</td>"+
                "<td>"+data.ln[i].nc.cname+"</td>"+
            "</tr>");
              }
              //遍歷生成頁面數
                //獲取span
                var span= $("#sp");
                 span.empty();
                 for(var i=1;i<=data.pages;i++){
                     if(pn==i){
                         span.append("<a href='javascript:void(0)' name='page' style='color:red' >"+i+"</a>&nbsp;&nbsp;")
                     }else{
                         span.append("<a href='javascript:void(0)' name='page'  >"+i+"</a>&nbsp;&nbsp;")
                     }
                 }
                 //點選頁面數請求頁碼資料
                 $("a[name=page]").click(function(){
                     getData($(this).html(),2);
                 })
         })
     }   
 })
</script>
</head>
<body>
  <table cellpadding="0" cellspacing="0" border="solid 1px" id="ta">
  </table>
  <a href="javascript:void(0)" id="up">上一頁</a>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  <span id="sp"></span>
   <a href="javascript:void(0)" id="down">下一頁</a>
</body>
</html>

原始碼:
連結:https://pan.baidu.com/s/1gsbr7kgXKFFgt4KeY_vYBg 密碼:azvf
問題的解決:

問題:Pojo類  什麼情況下使用註解?
需要建立物件的時候,並且不使用new方式建立,例如使用:
@Resource
private PageInfo pageInfo;
前提是在建立Pojo類時:
@Component
public class PageInfo{}

錯誤:
Error creating bean with name 'newsController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'newsServiceImpl' must be of type [com.bjsxt.serviceImpl.NewsServiceImpl], but was actually of type [com.sun.proxy.$Proxy14]


解決:

private  NewsServiceImpl newsServiceImpl;-->private  NewsService newsServiceImpl;

或者:
applicationContext:                         
<!--配置代理模式為cglib  -->
        <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>


注意不是:expose-proxy="true"

錯誤:
Error creating bean with name 'newsServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.bjsxt.pojo.PageInfo] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER, lookup=)}


解決:
 <!--配置註解掃描  -->
        <context:component-scan base-package="com.bjsxt.serviceImpl,com.bjsxt.pojo"></context:component-scan>

小結

springmvc的概念介紹
SpringMVC配置方式
Springmvc單元方法獲取請求資料
Spring接收引數的例子
增加的web.xml和spingmvc.xml
注意
小案例

相關文章