Spring入门简单静态资源处理

  • Springmvc简介及项目搭建
    • 1. 什么是springMVC?
    • SpringMVC处理请求的流程
    • 3. SpringMVC核心开发步骤
    • 4. SpringMVC的组件
    • 5. 如何在项目中添加springmvc
  • Springmvc之helloword实现
  • 简单CRUD及返回值处理
    • springmvc对静态资源的处理

Springmvc简介及项目搭建

1. 什么是springMVC?

Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。

SpringMVC处理请求的流程

首先用户发送请求–>DispatherServlet(拿到请求url并且处理获得请求/xx)
DispatcherServlet–>HandlerMapping(处理器映射器)找到被@requestMapping注解所标记的类或者方法
DispatcherServlet–>HandlerAdapter(处理器适配器)动态的实例化类,动态调用被标记的方法实现业务
HandlerAdapter–>处理器功能处理方法的调用
ModelAndView的逻辑视图名–>ViewRecolver
View–>渲染
返回控制权给DispatcherServlet,由DispatcherServlet返回呼应给用户,流程结束

3. SpringMVC核心开发步骤

1 DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
2 HandlerMapping的配置,从而将请求映射到处理器
3 HandlerAdapter的配置,从而支持多种类型的处理器
4 处理器(页面控制器)的配置,从而刊行功能处理
5 ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术

4. SpringMVC的组件

1 前端控制器(DispatcherServlet)
2 请求到处理器映射(HandlerMapping)
3 处理器适配器(HandlerAdapter)
4 视图解析器(ViewResolver)
5 处理器或页面控制器(Controller)
6 验证器(Validator)
7 命令对象(Command 请求参数绑定到的对象就叫命令对象)
8 表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)

5. 如何在项目中添加springmvc

1 添加相关依赖

因为等会要演示分页需要导入jstl

<?xml version="1.0" encoding="UTF-8"?><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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.liuchunming</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>ssm Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version><!--添加jar包依赖--><!--1.spring 5.0.2.RELEASE相关--><spring.version>5.0.2.RELEASE</spring.version><!--2.mybatis相关--><mybatis.version>3.4.5</mybatis.version><!--mysql--><mysql.version>5.1.44</mysql.version><!--pagehelper分页jar依赖--><pagehelper.version>5.1.2</pagehelper.version><!--mybatis与spring集成jar依赖--><mybatis.spring.version>1.3.1</mybatis.spring.version><!--3.dbcp2连接池相关 druid--><commons.dbcp2.version>2.1.1</commons.dbcp2.version><commons.pool2.version>2.4.3</commons.pool2.version><!-- log4j2日志配置相关依赖 --><log4j2.version>2.9.1</log4j2.version><log4j2.disruptor.version>3.2.0</log4j2.disruptor.version><slf4j.version>1.7.13</slf4j.version><!--5.其他--><junit.version>4.12</junit.version><servlet.version>4.0.0</servlet.version><lombok.version>1.18.2</lombok.version><!-- redis与spring的整合依赖 --><redis.version>2.9.0</redis.version><redis.spring.version>1.7.1.RELEASE</redis.spring.version><!-- jackson --><jackson.version>2.9.3</jackson.version><jstl.version>1.2</jstl.version><standard.version>1.1.2</standard.version><tomcat-jsp-api.version>8.0.47</tomcat-jsp-api.version></properties><dependencies><!--1.spring相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!--2.mybatis相关--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--pagehelper分页插件jar包依赖--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>${pagehelper.version}</version></dependency><!--mybatis与spring集成jar包依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis.spring.version}</version></dependency><!--3.dbcp2连接池相关--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>${commons.dbcp2.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons.pool2.version}</version></dependency><!-- log4j2日志相关依赖 --><!-- log配置:Log4j2 + Slf4j --><!-- slf4j核心包--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version><scope>runtime</scope></dependency><!--核心log4j2jar包--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version></dependency><!--用于与slf4j保持桥接--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j2.version}</version></dependency><!--web工程需要包含log4j-web,非web工程不需要--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j2.version}</version><scope>runtime</scope></dependency><!--需要使用log4j2的AsyncLogger需要包含disruptor--><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>${log4j2.disruptor.version}</version></dependency><!--5.其他--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><!--mybatis与ehcache整合--><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.1.0</version></dependency><!--ehcache依赖--><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.0</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>${redis.version}</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>${redis.spring.version}</version></dependency><!-- jackson --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency><!-- 5.3、jstl、standard --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>${standard.version}</version></dependency><!-- 5.4、tomcat-jsp-api --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jsp-api</artifactId><version>${tomcat-jsp-api.version}</version></dependency></dependencies><build><finalName>ssm</finalName><resources><!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--><resource><directory>src/main/resources</directory><includes><include>*.properties</include><include>*.xml</include></includes></resource></resources><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven.compiler.plugin.version}</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><dependencies><!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies><configuration><overwrite>true</overwrite></configuration></plugin><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin></plugins></pluginManagement></build>
</project>

2 在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)


springmvc-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" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 通过context:component-scan元素扫描指定包下的控制器--><!--1) 扫描com.javaxl.zf及子子孙孙包下的控制器(扫描范围过大,耗时)--><aop:aspectj-autoproxy/><context:component-scan base-package="com.liuchunming"/><!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --><!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,--><!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)--><mvc:annotation-driven></mvc:annotation-driven><!--3) ViewResolver --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar --><property name="viewClass"value="org.springframework.web.servlet.view.JstlView"></property><property name="prefix" value="/"/><property name="suffix" value=".jsp"/></bean><!--4) 单独处理图片、样式、js等资源 --><!--<mvc:resources location="/css/" mapping="/css/**"/>--><mvc:resources location="/static/" mapping="/static/**"/><!--<mvc:resources location="/js/" mapping="/js/**"/>--></beans>

3 修改web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><display-name>Archetype Created Web Application</display-name><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 读取Spring上下文的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Spring和web项目集成end --><!-- 防止Spring内存溢出监听器 --><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener><!-- 中文乱码处理 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!--web.xml 3.0的新特性,是否支持异步--><async-supported>true</async-supported><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- Spring MVC servlet --><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml--><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/springmvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup><!--web.xml 3.0的新特性,是否支持异步--><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

Springmvc之helloword实现

1 @Controller:用于标识处理器类 相当与替换了struts中的<action type=“xxx” 标签

2 @RequestMapping:请求到处理器功能方法的映射规则,可定义到类和方法
常用参数:value、method
可将@RequestMapping标签定义到类名处窄化路径

3 @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定
常用参数:value、required、defaultValue
注:required设置成false的参数类型必须是引用类型,因为基本数据类型是不能为null的

4 @ModelAttribute:请求参数到命令对象的绑定
常用参数:value
4.1 可用@ModelAttribute标注方法参数,方法参数会被添加到Model对象中(作用:向视图层传数据)
4.2 可用@ModelAttribute标注一个非请求处理方法,此方法会在每次调用请求处理方法前被调用(作用:数据初始化)
4.3 可用@ModelAttribute标注方法,方法返回值会被添加到Model对象中(作用:向视图层传数据)
但此方法视图的逻辑图就会根据请求路径解析,例如:a/test42 --> /WEB-INF/a/test42.jsp
太麻烦几乎不用,不用直接保存到Model或ModelAndView中

5@SessionAttributes:指定ModelMap中的哪些属性需要转存到session
常用参数:value、types
注1:必须放到class类名处

6 @InitBinder(本章暂不介绍):用于将请求参数转换到命令对象属性的对应类型

7@RequestBody(重要):用于目前比较流行的ajax开发的数据绑定(即提交数据的类型为json格式)

@ResponseBody 等于
ObjectMapper om =new ObjectMapper();
String xxx = om.writeValueAsString(“xxx”);
二行代码
只要有这个@ResponseBody不管你方法的返回值是
String类型还是集合它都能给你返回json数据
第一个springMVC程序:HelloWorld
创建controller包添加HelloContrller

HelloController

package com.liuchunming.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;/*** @author liuchunming* @site www.liuchunming.com* @company xxx公司* @create  2020-10-23 11:17*/
//将这个类交给spring所管理
@Controller
public class HelloController {/*** @ResponseBody  等于*       ObjectMapper om =new ObjectMapper();*         String xxx = om.writeValueAsString("xxx");*     三行代码* 只要有这个@ResponseBody不管你方法的返回值是* String类型还是集合它都能给你返回json数据**  五种情况*  1、转发到页面*  2、转发到根路径下的页面*  3、转发到requestMapper中*  4、重定向Dao根路径下的页面*  5、重定向到requestmapper下* @return*/@ResponseBody@RequestMapping("/hello1")public  String hello1()  {System.out.println("hello1 springmvc");return  "hello1 springmvc";}@RequestMapping("/hello2")public  String hello2(){System.out.println("hello2 springmvc 会进入页面");return  "hello";}@ResponseBody@RequestMapping("/hello3")public Map hello3(){System.out.println("hello3 springmvc json");Map map=new HashMap();map.put("total",12);map.put("rows","一串的数据");return  map;}/*五种情况*  1、转发到页面*  2、转发到根路径下的页面*  3、转发到requestMapper中*  4、重定向Dao根路径下的页面*  5、重定向到requestMapper下* @RequestMapping("/forward1")public  String forward1(){System.out.println("进来forward");return "aa";}@RequestMapping("/forward2")public  String forward2(){return "forward:/bb.jsp";}@RequestMapping("/forward3")public  String forward3(){return "forward:/forward1";}@RequestMapping("/redirect1")public  String redirect1(){return "redirect:/bb.jsp";}@RequestMapping("/redirect2")public  String redirect2(){return "redirect:/forward1";}
*/
}

访问hello1直接返回json串

进入到hello.jsp

集合也是返回json

页面跳转五种情况
1、转发到页面
2、转发到根路径下的页面
3、转发到requestMapper中
4、重定向Dao根路径下的页面
5、重定向到requestMapper下

转发:“forward:path”
重定向:“redirect:path”
注1:这两种跳转方式将会绕开视图解析器的前缀和后缀
注2:还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。

HelloController

package com.liuchunming.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;/*** @author liuchunming* @site www.liuchunming.com* @company xxx公司* @create  2020-10-23 11:17*/
//将这个类交给spring所管理
@Controller
public class HelloController {/*** @ResponseBody  等于*       ObjectMapper om =new ObjectMapper();*         String xxx = om.writeValueAsString("xxx");*     三行代码* 只要有这个@ResponseBody不管你方法的返回值是* String类型还是集合它都能给你返回json数据**  五种情况*  1、转发到页面*  2、转发到根路径下的页面*  3、转发到requestMapper中*  4、重定向Dao根路径下的页面*  5、重定向到requestmapper下* @return@ResponseBody@RequestMapping("/hello1")public  String hello1()  {System.out.println("hello1 springmvc");return  "hello1 springmvc";}@RequestMapping("/hello2")public  String hello2(){System.out.println("hello2 springmvc");return  "hello";}@ResponseBody@RequestMapping("/hello3")public Map hello3(){System.out.println("hello3 springmvc");Map map=new HashMap();map.put("total",12);map.put("rows","一串的数据");return  map;}*//*五种情况*  1、转发到页面*  2、转发到根路径下的页面*  3、转发到requestMapper中*  4、重定向Dao根路径下的页面*  5、重定向到requestMapper下* */@RequestMapping("/forward1")public  String forward1(){System.out.println("进来forward");return "aa";}@RequestMapping("/forward2")public  String forward2(){return "forward:/bb.jsp";}@RequestMapping("/forward3")public  String forward3(){return "forward:/forward1";}@RequestMapping("/redirect1")public  String redirect1(){return "redirect:/bb.jsp";}@RequestMapping("/redirect2")public  String redirect2(){return "redirect:/forward1";}}

简单CRUD及返回值处理

@PathVariable:用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 uri 模板中的变量作为参数。

之前是实现Modedriver来进行传值的,现在不用了,只需要在方法里面加一个实体就ok了,前台传值只需要注意与实体的属性对应就没问题。

其实现原理是利用环绕通知中获取所有参数的那种方法+反射赋值实现的。

分页标签
PageTag

package com.liuchunming.tag;import com.liuchunming.util.PageBean;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class PageTag extends BodyTagSupport{private static final long serialVersionUID = 1L;private PageBean pageBean;public PageBean getPageBean() {return pageBean;}public void setPageBean(PageBean pageBean) {this.pageBean = pageBean;}@Overridepublic int doStartTag() throws JspException {JspWriter out = pageContext.getOut();try {out.print(toHTML());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return super.doStartTag();}private String toHTML() {StringBuilder sb=new StringBuilder();//拼接下一次发送请求所要提交的隐藏的form表单sb.append("<form id='pageBeanForm' action='"+pageBean.getUrl()+"' method='post'>");//差第几页的数据sb.append("<input type='hidden' name='page'>");Map<String, String[]> pageMap = pageBean.getMap();if(pageMap.size()>0) {Set<Entry<String,String[]>> entrySet = pageMap.entrySet();for (Entry<String, String[]> entry : entrySet) {if(!"page".equals(entry.getKey())) {for(String val:entry.getValue()) {sb.append("<input type='hidden' value='"+val+"' name='"+entry.getKey()+"'>");}}}}sb.append("</form>");//默认展示前面四页int page =pageBean.getPage();//获取当前页int max=pageBean.getMaxPage();//获取最大页//当前页前面的页码是否大于4,大于就是4,小于前面页码-1int before = page > 4 ? 4 : page-1;//总共10页减去当前页,再减去当前页前面的页码int after = 10 - 1 - before;//最大页-当前页after = max-page > after ? after : max-page;//用来控制上一页点击按钮特效的boolean startFlag = page == 1;//用来控制下一页点击按钮特效的boolean endFlag = max == page; //          拼接分页条sb.append("<ul class='pagination'>");sb.append("<li class='page-item "+(startFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage(1)'>首页</a></li>");sb.append("<li class='page-item "+(startFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.getPreivousPage()+")'>&lt;</a></li>");//            代表了当前页的前4页for (int i = before; i > 0 ; i--) {sb.append("<li class='page-item'><a class='page-link' href='javascript:gotoPage("+(page-i)+")'>"+(page-i)+"</a></li>");}sb.append("<li class='page-item active'><a class='page-link' href='javascript:gotoPage("+pageBean.getPage()+")'>"+pageBean.getPage()+"</a></li>");//         代表了当前页的后5页for (int i = 1; i <= after; i++) {sb.append("<li class='page-item'><a class='page-link' href='javascript:gotoPage("+(page+i)+")'>"+(page+i)+"</a></li>");}sb.append("<li class='page-item "+(endFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.getNextPage()+")'>&gt;</a></li>");sb.append("<li class='page-item "+(endFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.getMaxPage()+")'>尾页</a></li>");sb.append("<li class='page-item go-input'><b>到第</b><input class='page-link' type='text' id='skipPage' name='' /><b>页</b></li>");sb.append("<li class='page-item go'><a class='page-link' href='javascript:skipPage()'>确定</a></li>");sb.append("<li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");sb.append("</ul>");//          拼接分页的js代码sb.append("<script type='text/javascript'>");sb.append("function gotoPage(page) {");sb.append("document.getElementById('pageBeanForm').page.value = page;");sb.append("document.getElementById('pageBeanForm').submit();");sb.append("}");sb.append("function skipPage() {");sb.append("var page = document.getElementById('skipPage').value;");sb.append("if (!page || isNaN(page) || parseInt(page) < 1 || parseInt(page) > "+max+") {");sb.append("alert('请输入1~N的数字');");sb.append("return;");sb.append("}");sb.append("gotoPage(page);");sb.append("}");sb.append("</script>");return sb.toString();}
}

pageBean

package com.liuchunming.util;import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;public class PageBean implements Serializable {private static final long serialVersionUID = 2422581023658455731L;//页码private int page=1;//每页显示记录数private int rows=10;//总记录数private int total=0;//是否分页private boolean isPagination=true;//上一次的请求路径private String url;//获取所有的请求参数private Map<String,String[]> map;public PageBean() {super();}//设置请求参数public void setRequest(HttpServletRequest req) {String page=req.getParameter("page");String rows=req.getParameter("rows");String pagination=req.getParameter("pagination");this.setPage(page);this.setRows(rows);this.setPagination(pagination);this.url=req.getContextPath()+req.getServletPath();this.map=req.getParameterMap();}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Map<String, String[]> getMap() {return map;}public void setMap(Map<String, String[]> map) {this.map = map;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}public void setPage(String page) {if(null!=page&&!"".equals(page.trim()))this.page = Integer.parseInt(page);}public int getRows() {return rows;}public void setRows(int rows) {this.rows = rows;}public void setRows(String rows) {if(null!=rows&&!"".equals(rows.trim()))this.rows = Integer.parseInt(rows);}public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public void setTotal(String total) {this.total = Integer.parseInt(total);}public boolean isPagination() {return isPagination;}public void setPagination(boolean isPagination) {this.isPagination = isPagination;}public void setPagination(String isPagination) {if(null!=isPagination&&!"".equals(isPagination.trim()))this.isPagination = Boolean.parseBoolean(isPagination);}/*** 获取分页起始标记位置* @return*/public int getStartIndex() {//(当前页码-1)*显示记录数return (this.getPage()-1)*this.rows;}/*** 末页* @return*/public int getMaxPage() {int totalpage=this.total/this.rows;if(this.total%this.rows!=0)totalpage++;return totalpage;}/*** 下一页* @return*/public int getNextPage() {int nextPage=this.page+1;if(this.page>=this.getMaxPage())nextPage=this.getMaxPage();return nextPage;}/*** 上一页* @return*/public int getPreivousPage() {int previousPage=this.page-1;if(previousPage<1)previousPage=1;return previousPage;}@Overridepublic String toString() {return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination+ "]";}
}

l.tld

<?xml version="1.0" encoding="UTF-8"?><taglib 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-jsptaglibrary_2_0.xsd"version="2.0"><description>JSTL 1.1 core library</description><display-name>JSTL core</display-name><tlib-version>1.1</tlib-version><short-name>l</short-name><uri>/liuchunming</uri><tag><name>page</name><tag-class>com.liuchunming.tag.PageTag</tag-class><body-content>JSP</body-content><attribute><name>pageBean</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>
</taglib>

BookController

package com.liuchunming.controller;import com.liuchunming.model.Book;
import com.liuchunming.service.BookService;
import com.liuchunming.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import java.util.List;/*** @author liuchunming* @site www.liuchunming.com* @company xxx公司* @create  2020-10-24 9:03* @RequestMapping("/book") :定义命名空间,防止请求重复*/
@Controller
@RequestMapping("/book")
public class BookController {@Autowiredprivate BookService bookService;@RequestMapping("/list")public String list(Book book, HttpServletRequest req){PageBean pageBean =new PageBean();pageBean.setRequest(req);List<Book> bb = this.bookService.listPager(book, pageBean);req.setAttribute("bookList",bb);req.setAttribute("pageBean",pageBean);return "bookList";}@RequestMapping("/proSave")public String proSave(Book book, HttpServletRequest req){if(book !=null && book.getBid() !=null && book.getBid()!=0){Book b = this.bookService.selectByPrimaryKey(book.getBid());req.setAttribute("book2",b);}return "bookEdit";}@RequestMapping("/add")public String add(Book book,HttpServletRequest req){this.bookService.insert(book);//redirect:/book/list   跳到命名空间中的list方法return "redirect:/book/list";}@RequestMapping("/edit")public String edit(Book book, HttpServletRequest req){this.bookService.updateByPrimaryKeySelective(book);return "redirect:/book/list";}@RequestMapping("/del/{bid}")public String del(@PathVariable("bid") Integer bid, HttpServletRequest req){this.bookService.deleteByPrimaryKey(bid);return "redirect:/book/list";}
}

效果

模糊查询

springmvc对静态资源的处理

正常来说我访问项目下这张图片是访问不到的会报错404,springmvc框架会将静态资源文件访问,当作一个request请求来处理,最终会找不到对应的资源文件


在springmvc-servlet.xml中配置映射js/css映射路径


访问效果

SpringMVC入门简单静态资源处理相关推荐

  1. SpringMVC REST 风格静态资源访问配置

    1 在web.xml中使用默认servlet处理静态资源,缺点是如果静态资源过多,则配置量会比较大,一旦有遗漏,则会造成资源无法正常显示或404错误. <!-- 静态资源访问控制 -->& ...

  2. 【SpringMVC】:静态资源

    文章目录 1.访问静态资源 2.中文乱码 3.类型转换器 3.1.内置的类型转换器 3.2.自定义类型转换器 1.访问静态资源 在项目中我们可以需要用到 js .css 和图片等静态资源,而在 Spr ...

  3. SpringMVC拦截静态资源的解决方法

    本文中的各软件版本简要信息: IDE:Myeclise17 JDK:1.8.0_111 spring:5.1.8 springMVC:5.1.8 mybatis:3.2.2 Tomcat:9.0 在使 ...

  4. SpringMVC 中静态资源的处理

    web项目中web.xml配置 在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet <servlet><servle ...

  5. SpringMVC中静态资源的处理

    web项目中web.xml配置 在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet <servlet><servle ...

  6. 最简单的静态资源服务器(超级详细)

    提示:本文有参考其他前端部署相关资源,侵权请联系作者删除 目录 一.前言 二.基础知识 三.入手部署最简单的静态资源服务器 1.手写最简单的静态资源服务器:响应字符串 2.手写简单静态资源服务器: 响 ...

  7. 静态资源请求被拦截问题

    SpringMVC中配置URL拦截,非常简单.网上找个示例,就能通过.但是,在我做了好几个Web项目,又参与了别人主导的Web项目时,发现URL配置也非常有学问. 先说说一种比较常见的: <se ...

  8. SSM-页面无法显示图片,样式等静态资源

    SSM项目中,访问页面时无法访问图片,样式,js,字体等效果时,一般是因为springmvc拦截了静态资源,这时候需要在springmvc中添加配置. 在web.xml中添加 <!-- 加载静态 ...

  9. springMVC设置静态资源过滤器,过滤js、css、images等静态资源

    首先看个index.jsp首页的代码 <%@ page contentType="text/html;charset=UTF-8" language="java&q ...

  10. springMVC对静态资源访问的处理

    在restful  风格下springMVC会进行如下配置 <servlet> <servlet-name>mvc</servlet-name><servle ...

最新文章

  1. 人体关键点颜色和预处理
  2. i2c Linux 动态 波特率,如何在Linux中设置i2c总线的波特率?
  3. 打印机打印网页不清晰_打印机墨水:你不知道的秘密
  4. 【ABAP】SAP供应商自定义决裁生成实现
  5. Go之Beego原生查询QueryRow QueryRows Values ValuesList ValuesFlat RowsToMap RowsToStruct
  6. Leetcode--343. 整数拆分
  7. 操作系统实践(四/五)
  8. (20190401)IGS GNSS数据下载网址与下载说明
  9. 【C语言】——背包问题详解
  10. 文件二维码制作生成网站
  11. c++对象模型探索-王健伟-专题视频课程
  12. Mentor.Graphics.FloTHERM.XT.2.3+Mentor.Graphics.Flowmaster.7.9.4
  13. Arcgis中给nodata的值设为空
  14. 用于期望视场中光导耦合的二元光栅的优化
  15. 计算机系统基础实验报告
  16. read only status pyCharm
  17. 洗衣机异响如何维修?洗衣机声音很响怎么维修?洗衣机异响如何处理?
  18. kibana Discover界面出No results found
  19. H. 银行账户(拷贝构造)
  20. 基于flask的在线笔记共享管理系统【2】(数据库的设计和建立)

热门文章

  1. 安卓微信自动抢红包插件优化和实现
  2. iOS蓝牙开发之数据传输精华篇
  3. 思科路由视频_HCNA-HNTD(H12-211)中文题库H10.24
  4. 浏览器看直播html5卡顿,win10自带浏览器看直播卡顿怎么解决_win10浏览器看直播一卡一卡修复方法-win7之家...
  5. SiteMesh3使用介绍及配置方法
  6. java实现数据库回滚,java 数据库操作,事宜回滚
  7. 超市库存管理java sql_超市仓库管理系统的设计与实现(MySQL)
  8. 记账软件哪个好用,亲测有效
  9. wxParse解析iframe播放视频
  10. 怎样用matlab拟合,怎么用用matlab拟合两条直线