Day69 Spring MVC 概念及其配置方式、Springmvc單元方法獲取請求資料
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> ")
}else{
span.append("<a href='javascript:void(0)' name='page' >"+i+"</a> ")
}
}
//點選頁面數請求頁碼資料
$("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>
<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
注意
小案例
相關文章
- spring mvc中獲取請求URLSpringMVC
- Spring系列 SpringMVC的請求與資料響應SpringMVC
- SpringMVC原始碼之Handler註冊、獲取以及請求controller中方法SpringMVC原始碼Controller
- Spring MVC 獲取三個域(request請求域,session 會話域,application 應用域)物件的方式SpringMVCSession會話APP物件
- 使用Python獲取HTTP請求頭資料PythonHTTP
- 過濾器中獲取form表單或url請求資料過濾器ORM
- 胖哥學SpringMVC:請求方式轉換過濾器配置SpringMVC過濾器
- 表單請求獲取路由引數路由
- spring boot學習(7)— 配置資訊的獲取方式Spring Boot
- 達夢資料庫歸檔方式及其配置方法資料庫
- (七)Spring Boot Controller的請求引數獲取Spring BootController
- SpringMVC的資料獲取問題SpringMVC
- Spring MVC的請求處理邏輯SpringMVC
- python requests get請求 如何獲取所有請求Python
- gin框架獲取請求引數的8大方式框架
- Spring MVC能響應HTTP請求的原因?SpringMVCHTTP
- 爬蟲實戰:從HTTP請求獲取資料解析社群爬蟲HTTP
- Spring Boot中的 6 種API請求引數讀取方式Spring BootAPI
- 前端快取API請求資料前端快取API
- 初識 SpringMVC,執行配置第一個Spring MVC 程式SpringMVC
- Spring MVC框架處理Web請求的基本流程SpringMVC框架Web
- Spring MVC檔案請求處理詳解:MultipartResolverSpringMVC
- Spring MVC 處理一個請求的流程分析SpringMVC
- $request 請求方法 獲取 API 的當前使用者API
- Spring Boot EL獲取配置檔案中的值的方式Spring Boot
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- Spring MVC 入門指南(十三):獲取Cookie值SpringMVCCookie
- Laravel 中 $request 獲取請求資訊 用法 總結Laravel
- curl 請求獲取響應時間
- Spring多資料來源獲取Spring
- springmvc處理ajax請求SpringMVC
- SpringMVC請求引數解析SpringMVC
- Spring - 獲取ApplicationContext的幾種方式SpringAPPContext
- Spring框架系列(5) - 深入淺出SpringMVC請求流程和案例框架SpringMVC
- 單元格資料鑽取
- Postman模擬瀏覽器網頁請求並獲取網頁資料Postman瀏覽器網頁
- vue專案及axios請求獲取資料(cp網站搭建制作)VueiOS網站
- 前端獲取不到後端新增的請求頭資訊前端後端