英文网站cms,国企单位网站建设方案,上海有限公司有哪些,成都网站建设哪里有SpringMVC是一个基于MVC架构的框架#xff0c;它可以帮助我们实现前后端的分离#xff0c;同时也能很好地支持前端的增删改查操作。 配置
Cloudjun
?xml version1.0 encodingUTF-8 ?taglib xmlnshttp://java.sun.com/xml/ns/j…SpringMVC是一个基于MVC架构的框架它可以帮助我们实现前后端的分离同时也能很好地支持前端的增删改查操作。 配置
Cloudjun
?xml version1.0 encodingUTF-8 ?taglib xmlnshttp://java.sun.com/xml/ns/j2eexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsdversion2.0descriptionCloudJun 1.1 core library/descriptiondisplay-nameCloudJun core/display-nametlib-version1.1/tlib-versionshort-nameCloudJun/short-nameurihttp://jsp.veryedu.cn/uritagnamepage/nametag-classcom.CloudJun.tag.PageTag/tag-classbody-contentJSP/body-contentattributenamepageBean/namerequiredtrue/requiredrtexprvaluetrue/rtexprvalue/attribute/tag/taglib
web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsdversion3.1display-nameArchetype Created Web Application/display-name!-- Spring和web项目集成start --!-- spring上下文配置文件 --context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-context.xml/param-value/context-param!-- 读取Spring上下文的监听器 --listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listener!-- Spring和web项目集成end --!-- 中文乱码处理 --filterfilter-nameencodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classasync-supportedtrue/async-supportedinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param/filterfilter-mappingfilter-nameencodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!-- Spring MVC servlet --servletservlet-nameSpringMVC/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class!--此参数可以不配置默认值为/WEB-INF/springmvc-servlet.xml--init-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-paramload-on-startup1/load-on-startup!--web.xml 3.0的新特性是否支持异步--async-supportedtrue/async-supported/servletservlet-mappingservlet-nameSpringMVC/servlet-nameurl-pattern//url-pattern/servlet-mapping
/web-appzhang.tld
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsdversion3.1display-nameArchetype Created Web Application/display-name!-- Spring和web项目集成start --!-- spring上下文配置文件 --context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-context.xml/param-value/context-param!-- 读取Spring上下文的监听器 --listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listener!-- Spring和web项目集成end --!-- 中文乱码处理 --filterfilter-nameencodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classasync-supportedtrue/async-supportedinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param/filterfilter-mappingfilter-nameencodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!-- Spring MVC servlet --servletservlet-nameSpringMVC/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class!--此参数可以不配置默认值为/WEB-INF/springmvc-servlet.xml--init-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-paramload-on-startup1/load-on-startup!--web.xml 3.0的新特性是否支持异步--async-supportedtrue/async-supported/servletservlet-mappingservlet-nameSpringMVC/servlet-nameurl-pattern//url-pattern/servlet-mapping
/web-appgeneratorConfig.xml
?xml version1.0 encodingUTF-8 ?!DOCTYPE generatorConfiguration PUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//ENhttp://mybatis.org/dtd/mybatis-generator-config_1_0.dtd
generatorConfiguration
!-- 引入配置文件 --
properties resourcejdbc.properties/!--指定数据库jdbc驱动jar包的位置--
classPathEntry locationD:\\temp\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar/!-- 一个数据库一个context --
context idinfoGuardian!-- 注释 --commentGeneratorproperty namesuppressAllComments valuetrue/!-- 是否取消注释 --property namesuppressDate valuetrue/ !-- 是否生成注释代时间戳 --/commentGenerator!-- jdbc连接 --jdbcConnection driverClass${jdbc.driver}connectionURL${jdbc.url} userId${jdbc.username} password${jdbc.password}/!-- 类型转换 --javaTypeResolver!-- 是否使用bigDecimal false可自动转化以下类型Long, Integer, Short, etc. --property nameforceBigDecimals valuefalse//javaTypeResolver!-- 01 指定javaBean生成的位置 --!-- targetPackage指定生成的model生成所在的包名 --!-- targetProject指定在该项目下所在的路径 --javaModelGenerator targetPackagecom.CloudJun.modeltargetProjectsrc/main/java!-- 是否允许子包即targetPackage.schemaName.tableName --property nameenableSubPackages valuefalse/!-- 是否对model添加构造函数 --property nameconstructorBased valuetrue/!-- 是否针对string类型的字段在set的时候进行trim调用 --property nametrimStrings valuefalse/!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法只有构造方法 --property nameimmutable valuefalse//javaModelGenerator!-- 02 指定sql映射文件生成的位置 --sqlMapGenerator targetPackagecom.CloudJun.mappertargetProjectsrc/main/java!-- 是否允许子包即targetPackage.schemaName.tableName --property nameenableSubPackages valuefalse//sqlMapGenerator!-- 03 生成XxxMapper接口 --!-- typeANNOTATEDMAPPER,生成Java Model 和基于注解的Mapper对象 --!-- typeMIXEDMAPPER,生成基于注解的Java Model 和相应的Mapper对象 --!-- typeXMLMAPPER,生成SQLMap XML文件和独立的Mapper接口 --javaClientGenerator targetPackagecom.CloudJun.mappertargetProjectsrc/main/java typeXMLMAPPER!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model true:com.oop.eksp.user.model.[schemaName] --property nameenableSubPackages valuefalse//javaClientGenerator!-- 配置表信息 --!-- schema即为数据库名 --!-- tableName为对应的数据库表 --!-- domainObjectName是要生成的实体类 --!-- enable*ByExample是否生成 example类 --!--table schema tableNamet_book domainObjectNameBook--!--enableCountByExamplefalse enableDeleteByExamplefalse--!--enableSelectByExamplefalse enableUpdateByExamplefalse--!--lt;!ndash; 忽略列不生成bean 字段 ndash;gt;--!--lt;!ndash; ignoreColumn columnFRED / ndash;gt;--!--lt;!ndash; 指定列的java数据类型 ndash;gt;--!--lt;!ndash; columnOverride columnLONG_VARCHAR_FIELD jdbcTypeVARCHAR / ndash;gt;--!--/table--table schema tableNamet_hotel domainObjectNameHotelenableCountByExamplefalse enableDeleteByExamplefalseenableSelectByExamplefalse enableUpdateByExamplefalse/table/context
/generatorConfiguration
jdbc.properties
jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://localhost/mybatis_ssm?useUnicodetruecharacterEncodingUTF-8
jdbc.usernameroot
jdbc.password123456
log4j2.xml
?xml version1.0 encodingUTF-8?!-- status : 指定log4j本身的打印日志的级别.ALL Trace DEBUG INFO WARN ERROR FATAL OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间单位是s,最小是5s. --
Configuration statusWARN monitorInterval30Properties!-- 配置日志文件输出目录 ${sys:user.home} --Property nameLOG_HOME/root/workspace/lucenedemo/logs/Propertyproperty nameERROR_LOG_FILE_NAME/root/workspace/lucenedemo/logs/error/propertyproperty nameWARN_LOG_FILE_NAME/root/workspace/lucenedemo/logs/warn/propertyproperty namePATTERN%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n/property/PropertiesAppenders!--这个输出控制台的配置 --Console nameConsole targetSYSTEM_OUT!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --ThresholdFilter leveltrace onMatchACCEPTonMismatchDENY /!-- 输出日志的格式 --!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 %m : 日志内容即 logger.info(message) %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 --PatternLayout pattern${PATTERN} //Console!--文件会打印出所有信息这个log每次运行程序会自动清空由append属性决定这个也挺有用的适合临时测试用 --!--append为TRUE表示消息增加到指定文件中false表示消息覆盖指定的文件内容默认值是true --File namelog fileNamelogs/test.log appendfalsePatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n //File!-- 这个会打印出所有的info及以下级别的信息每次大小超过size 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩作为存档 --RollingFile nameRollingFileInfo fileName${LOG_HOME}/info.logfilePattern${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch --ThresholdFilter levelinfo onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /Policies!-- 基于时间的滚动策略interval属性用来指定多久滚动一次默认是1 hour。 modulatetrue用来调整时间比如现在是早上3aminterval是4那么第一次滚动是在4am接着是8am12am...而不是7am. --!-- 关键点在于 filePattern后的日期格式以及TimeBasedTriggeringPolicy的interval 日期格式精确到哪一位interval也精确到哪一个单位 --!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log --TimeBasedTriggeringPolicy interval1modulatetrue /!-- SizeBasedTriggeringPolicy:Policies子节点 基于指定文件大小的滚动策略size属性用来定义每个日志文件的大小. --!-- SizeBasedTriggeringPolicy size2 kB / --/Policies/RollingFileRollingFile nameRollingFileWarn fileName${WARN_LOG_FILE_NAME}/warn.logfilePattern${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.logThresholdFilter levelwarn onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /PoliciesTimeBasedTriggeringPolicy /SizeBasedTriggeringPolicy size2 kB //Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件这里设置了20 --DefaultRolloverStrategy max20 //RollingFileRollingFile nameRollingFileError fileName${ERROR_LOG_FILE_NAME}/error.logfilePattern${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.logThresholdFilter levelerror onMatchACCEPTonMismatchDENY /PatternLayoutpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /Policies!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log --TimeBasedTriggeringPolicy interval1modulatetrue /!-- SizeBasedTriggeringPolicy size10 MB / --/Policies/RollingFile/Appenders!--然后定义logger只有定义了logger并引入的appenderappender才会生效 --Loggers!--过滤掉spring和mybatis的一些无用的DEBUG信息 --logger nameorg.springframework levelINFO/loggerlogger nameorg.mybatis levelINFO/logger!-- 第三方日志系统 --logger nameorg.springframework levelERROR /logger nameorg.hibernate levelERROR /logger nameorg.apache.struts2 levelERROR /logger namecom.opensymphony.xwork2 levelERROR /logger nameorg.jboss levelERROR /!-- 配置日志的根节点 --root levelallappender-ref refConsole /appender-ref refRollingFileInfo /appender-ref refRollingFileWarn /appender-ref refRollingFileError //root/Loggers/Configurationspring-context.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdimport resourceclasspath:spring-mybatis.xml/import
/beansspring-mvc.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大耗时)--context:component-scan base-packagecom.yuan/!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --mvc:annotation-driven /!--3) 创建ViewResolver视图解析器 --bean classorg.springframework.web.servlet.view.InternalResourceViewResolver!-- viewClass需要在pom中引入两个包standard.jar and jstl.jar --property nameviewClassvalueorg.springframework.web.servlet.view.JstlView/propertyproperty nameprefix value/WEB-INF/jsp//property namesuffix value.jsp//bean!--4) 单独处理图片、样式、js等资源 --!-- mvc:resources location/css/ mapping/css/**/mvc:resources location/js/ mapping/js/**/mvc:resources locationWEB-INF/images/ mapping/images/**/--
!-- mvc:resources location/static/ mapping/static/**/--aop:aspectj-autoproxy/
/beansspring-mybatis.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/context xmlns:txhttp://www.springframework.org/schema/txxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd!--1. 注解式开发 --!-- 注解驱动 --context:annotation-config/!-- 用注解方式注入bean并指定查找范围com.javaxl.ssm及子子孙孙包--context:component-scan base-packagecom.yuan/context:property-placeholder locationclasspath:jdbc.properties/bean iddataSource classorg.apache.commons.dbcp2.BasicDataSourcedestroy-methodcloseproperty namedriverClassName value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}/!--初始连接数--property nameinitialSize value10/!--最大活动连接数--property namemaxTotal value100/!--最大空闲连接数--property namemaxIdle value50/!--最小空闲连接数--property nameminIdle value10/!--设置为-1时如果没有可用连接连接池会一直无限期等待直到获取到连接为止。--!--如果设置为N毫秒则连接池会等待N毫秒等待不到则抛出异常--property namemaxWaitMillis value-1//bean!--4. spring和MyBatis整合 --!--1) 创建sqlSessionFactory--bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean!-- 指定数据源 --property namedataSource refdataSource/!-- 自动扫描XxxMapping.xml文件**任意路径 --property namemapperLocations valueclasspath*:com/yuan/**/mapper/*.xml/!-- 指定别名 --property nametypeAliasesPackage valuecom/yuan/**/model/!--配置pagehelper插件--property namepluginsarraybean classcom.github.pagehelper.PageInterceptorproperty namepropertiesvaluehelperDialectmysql/value/property/bean/array/property/bean!--2) 自动扫描com/javaxl/ssm/**/mapper下的所有XxxMapper接口(其实就是DAO接口)并实现这些接口--!-- 即可直接在程序中使用dao接口不用再获取sqlsession对象--bean classorg.mybatis.spring.mapper.MapperScannerConfigurer!--basePackage 属性是映射器接口文件的包路径。--!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径--property namebasePackage valuecom/yuan/**/mapper/property namesqlSessionFactoryBeanName valuesqlSessionFactory//beanbean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource //beantx:annotation-driven transaction-managertransactionManager /aop:aspectj-autoproxy/
/beansStudentBizImpl
package com.zhanghao.Biz.Impl;import com.zhanghao.Biz.StudentBiz;
import com.zhanghao.mapper.StudentMapper;
import com.zhanghao.model.Student;
import com.zhanghao.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** author zhanghao* site* company s集团* create 2023-09-08 23:12*/
Service
public class StudentBizImpl implements StudentBiz {Autowiredprivate StudentMapper studentMapper;Overridepublic int deleteByPrimaryKey(String sid) {return studentMapper.deleteByPrimaryKey(sid);}Overridepublic int insert(Student record) {return studentMapper.insert(record);}Overridepublic int insertSelective(Student record) {return studentMapper.insertSelective(record);}Overridepublic Student selectByPrimaryKey(String sid) {return studentMapper.selectByPrimaryKey(sid);}Overridepublic int updateByPrimaryKeySelective(Student record) {return studentMapper.updateByPrimaryKeySelective(record);}Overridepublic int updateByPrimaryKey(Student record) {return studentMapper.updateByPrimaryKey(record);}Overridepublic ListStudent selBySnamePager(Student student, PageBean pageBean) {return studentMapper.selBySnamePager(student);}}
PagerAspect
package com.zhanghao.aspect;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhanghao.utils.PageBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;import java.util.List;/*** author zhanghao* site* company s集团* create 2023-08-25 17:01*/
Aspect
Component
public class PagerAspect {Around(execution(* *..*Biz.*Pager(..)))public Object invoke(ProceedingJoinPoint args) throws Throwable {PageBean pageBean null;//获取目标中的所有方法Object[] args1 args.getArgs();for (Object o : args1) {if (o instanceof PageBean) {pageBean (PageBean) o;break;}}if (pageBean ! null pageBean.isPagination()) {PageHelper.startPage(pageBean.getPage(), pageBean.getRows());}Object proceed args.proceed();if (pageBean ! null pageBean.isPagination()) {PageInfo pageInfo new PageInfo((List) proceed);pageBean.setTotal((int) pageInfo.getTotal());}return proceed;}}
PageTag
package com.zhanghao.tag;import com.zhanghao.utils.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 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) {e.printStackTrace();}return super.doStartTag();}private String toHTML() {StringBuffer sb new StringBuffer();
// 隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
// 上一次请求的URLsb.append(form actionpageBean.getUrl() idpageBeanForm methodpost);sb.append( input typehidden namepage);
// 上一次请求的参数MapString, String[] paramMap pageBean.getMap();if(paramMap ! null paramMap.size() 0) {SetEntryString, String[] entrySet paramMap.entrySet();for (EntryString, String[] entry : entrySet) {
// 参数名String key entry.getKey();
// 参数值for (String value : entry.getValue()) {
// 上一次请求的参数再一次组装成了新的Form表单
// 注意page参数每次都会提交我们需要避免if(!page.equals(key)) {sb.append( input typehidden namekey valuevalue );}}}}sb.append(/form);// 分页条sb.append(ul classpagination justify-content-center);sb.append( li classpage-item (pageBean.getPage() 1 ? disabled : )a classpage-link);sb.append( hrefjavascript:gotoPage(1)首页/a/li);sb.append( li classpage-item (pageBean.getPage() 1 ? disabled : )a classpage-link);sb.append( hrefjavascript:gotoPage(pageBean.getPreivousPage())lt;/a/li);// less than 小于号
// sb.append( li classpage-itema classpage-link href#1/a/li);
// sb.append( li classpage-itema classpage-link href#2/a/li);sb.append( li classpage-item activea classpage-link href#pageBean.getPage()/a/li);sb.append( li classpage-item (pageBean.getPage() pageBean.getMaxPage() ? disabled : )a classpage-link hrefjavascript:gotoPage(pageBean.getNextPage())gt;/a/li);sb.append( li classpage-item (pageBean.getPage() pageBean.getMaxPage() ? disabled : )a classpage-link hrefjavascript:gotoPage(pageBean.getMaxPage())尾页/a/li);sb.append( li classpage-item go-inputb到第/binput classpage-link);sb.append( typetext idskipPage name /b页/b/li);sb.append( li classpage-item goa classpage-link);sb.append( hrefjavascript:skipPage()确定/a/li);sb.append( li classpage-itemb共pageBean.getTotal()条/b/li);sb.append(/ul);// 分页执行的JS代码sb.append(script typetext/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) pageBean.getMaxPage()) {);sb.append( alert(请输入1~pageBean.getMaxPage()的数字););sb.append( return;);sb.append( });sb.append( gotoPage(page););sb.append( });sb.append(/script);return sb.toString();}
}
实现功能
StudentController
package com.zhanghao.web;import com.zhanghao.Biz.StudentBiz;
import com.zhanghao.model.Student;
import com.zhanghao.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import java.util.List;/*** author zhanghao* site* company s集团* create 2023-09-08 21:52*/
Controller
RequestMapping(/student)
public class StudentController {Autowiredprivate StudentBiz studentBiz;RequestMapping(/list)public String list(Student student, HttpServletRequest request){PageBean pageBean new PageBean();pageBean.setRequest(request);ListStudent students studentBiz.selBySnamePager(student, pageBean);request.setAttribute(list,students);request.setAttribute(pageBean,pageBean);return stu/list;}RequestMapping(/add)public String add(Student student){studentBiz.insertSelective(student);return redirect:list;}RequestMapping(/del/{sid})public String add(PathVariable(sid) String sid){studentBiz.deleteByPrimaryKey(sid);return redirect:/student/list;}RequestMapping(/edit)public String edit(Student student){studentBiz.updateByPrimaryKeySelective(student);return redirect:list;}RequestMapping(/pareSave)public String pareSave(Student student, Model model){if(student!null student.getSid()!null){Student s studentBiz.selectByPrimaryKey(student.getSid());model.addAttribute(s,s);}return stu/edit;}}
JSP
List.jsp
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
!DOCTYPE html
html
head
% include file/common/header.jsp %
/head
body
form classform-inlineaction/student/list methodpostdiv classform-group mb-2input typetext classform-control-plaintext namesnameplaceholder请输入学生名称!-- input namerows value20 typehidden --!-- 不想分页 --
%-- input namepagination valuefalse typehidden--%/divbutton typesubmit classbtn btn-primary mb-2查询/buttona classbtn btn-primary mb-2 href/student/pareSave新增/a
/formtable classtable table-striped theadtrth scopecol学生编号/thth scopecol学生名称/thth scopecol学生年龄/thth scopecol学生性别/thth scopecol操作/th/tr/theadtbodyc:forEach vars items${list }trtd${s.sid }/tdtd${s.sname }/tdtd${s.sage }/tdtd${s.ssex }/tdtda href/student/pareSave?sid${s.sid}修改/aa href/student/del/${s.sid}删除/a/td/tr/c:forEach/tbody
/table
!-- 这一行代码就相当于前面分页需求前端的几十行了 --
z:page pageBean${pageBean }/z:page
${pageBean}
/body
/htmledit.jsp
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
headmeta http-equivContent-Type contenttext/html; charsetUTF-8title/title
/head
body
form action${pageContext.request.contextPath }/${empty s ? student/add : student/edit} methodpost学生编号:input typetext namesid value${s.sid }br学生姓名:input typetext namesname value${s.sname }br学生年龄:input typetext namesage value${s.sage }br学生性别:input typetext namessex value${s.ssex }brinput typesubmit
/form
/body
/htmlheard.jsp
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
% taglib urihttp://jsp.veryedu.cn prefixz%
% taglib urihttp://java.sun.com/jsp/jstl/core prefixc%
!DOCTYPE html
html
headmeta http-equivContent-Type contenttext/html; charsetUTF-8linkhrefhttps://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.cssrelstylesheetscriptsrchttps://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js/scriptbase href${pageContext.request.contextPath } /
/head前端增删改查实现一般需要完成以下几个步骤 前端页面设计。前端页面应该清晰明了使用户易于理解和使用。需要定义表格用于展示数据包括表头和表内容同时还需要添加各种操作按钮用于增加、修改和删除数据。 接口设计。接口是前后端之间的桥梁要实现增删改查功能需要定义对应的增删改查接口。接口应该具有明确的功能和参数以便前端能够正确调用。 数据库设计。数据库是存储数据的重要组成部分。需要定义对应的数据表包括数据列、数据类型和主键等以便后台能够存储数据并进行操作。 前端逻辑实现。前端需要编写对应的JavaScript代码来实现增删改查功能。具体包括对表格进行初始化、监听操作按钮点击事件、调用后台接口进行数据操作等。 后台接口实现。后台接口需要根据前端定义的接口进行实现。一般需要包括对应的增删改查方法以便能够正确处理前端传递的参数和数据。 后台逻辑实现。后台需要根据前端传递的参数和数据进行相应的处理包括数据的存储和修改、数据的查询和删除等。同时还需要对数据进行校验和验证保证数据的正确性和安全性。 综上所述前端增删改查实现需要前后端配合完成同时还需要遵循一定的规范和标准才能够实现功能完善、性能优良的系统。