关于项目开发技术方案
基本骨架:
-
A:DB(Mysql、Oracle)+ JDBC +javaBean+JSP (M1模型:视图与控制层混合) 打单
-
B:JSP(JSTL/EL)(AJAX) + servlet(原生框架) + JavaBean +(连接池)+DB(Mysql、Oracle) M2
-
C: html+jQuery +|+servlet +javaBean +DB ( M2前后端分离架构) 承担架构风险
-
D: html+jQuery +|+Springmvc +Spring+service+spring+ DAO (Mybatis\JPA\spring-JDBC) +DB
(基于开源框架M2前后端分离)
-
E:thymeleaf + +springboot (springMVC+spring+mybatis)+DB 替换B方案
-
F: html(Jquery/angular/vue/react) +springboot (springMVC+spring+mybatis)+DB
(H5+android+IOS+harmonyOS) +springboot (springMVC+spring+mybatis)+DB
分布式微服务:
-
G:SpringCloud(Eureka、ribbon、feign、hystrix、zuul、config) 微服务
-
H:基于alibaba (nacos、gateway、feign、setinel) 微服务
-
I:基于doubbo+zookeeper 微服务
锦上添花
-
redis
- 权限系统
- 基于Filter的拦截的权限验证 A、B、C、D、E、F、
- 基于Interceptor 拦截器的权限系统 A、B、C、D、E、F、G、H
- 基于shiro安全框架的权限系统 a、b、D、E
- 基于security 安全框架的权限系统(仅用于基于spring技术体系)
- 基于单点登陆的权限系统 (分布式、微服务)
- 报表系统
- 自定义报表系统(完美级)
- 基于Excel (POI)
- 图形化(统计)
- ECharts(直方图、饼图、折线、热力图、雷达)
- 地理信息(百度)
- 日志系统(非常成熟的产品中)
高并发
- redis实现短时间多次读取重复的数据
- 云端数据库实现静态资源的
git设计
分三个分支,
一个主支(普通开发者没有权限向master上推代码,管理员才可以),
一个测试分支从主支拉出来的(往这个上合调试),
一个本地开发分支从主分支拉出来,开发完成上测试调试,通过再上主支
前端框架的选择
VUE----html
1.解释
2.复制
Servlet—jsp
1.解释
2.复制
layui—html
1.解释
2.复制
servlet
方法反射工具类
1.解释
private static final long serialVersionUID = 1L; public BaseServlet() { super(); } protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Class<? extends BaseController> clazz = this.getClass(); String op = req.getParameter("op"); try { Method m = clazz.getDeclaredMethod(op,HttpServletRequest.class,HttpServletResponse.class); m.setAccessible(true); m.invoke(this,req,resp); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
2.复制
private static final long serialVersionUID = 1L; public BaseServlet() { super(); } protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Class<? extends BaseController> clazz = this.getClass(); String op = req.getParameter("op"); try { Method m = clazz.getDeclaredMethod(op,HttpServletRequest.class,HttpServletResponse.class); m.setAccessible(true); m.invoke(this,req,resp); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
同步响应
1.请求转发
login.jsp-->/user-->登录失败-->服务将结果转发到login.jsp,在此期间客户端只发了一次请求,最终服务器请求到了login.jsp request.setAttribute("err","错误信息") request.getRequestDispatcher(url).forward(request,response); 请求转发发生在服务器端,服务器将请求的结果发往另一请求;login.jsp-->/user-->登录失败-->服务将结果转发到login.jsp,在此期间客户端只发了一次请求,最终服务器请求到了login.jsp
1.1复制
request.setAttribute("err","错误信息") request.getRequestDispatcher(url).forward(request,response);
2.重定向
login.jsp-->/user-->登录成功-->服务器将下一个资源通知客户端,再由客户端发起二次请求到达 index.jsp页面; response.sendRedirect(url); 请求转发发生在客户端,服务器将请求的结果返回到客户端,客户端再次发请求,到达最终资源处
2.1 复制
response.sendRedirect(url);
异步响应
1.解释
2.复制
PrintWriter pw = response.getWriter(); pw.write(message); pw.flush(); pw.close();
接受请求
1.解释
2.复制
String string = request.getParameter("name");
文件上传
方法1
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建上传对象 FileItemFactory fileItemFactory=new DiskFileItemFactory(); ServletFileUpload upload=new ServletFileUpload(fileItemFactory); Goods goods=new Goods();// Class clazz=goods.getClass(); //根据请求request获得上传数据 try { List<FileItem> fileItems = upload.parseRequest(req); for(FileItem items:fileItems){ String fieldName=items.getFieldName();//setGname()// method--modify //区分是否是普通表单元素/上传IO流 if(items.isFormField()){ //普通字段 值=request.getParameter(字段名) String value=items.getString(); Class<?> type = clazz.getDeclaredField(fieldName).getType(); if(type== Date.class){ BeanUtils.setProperty(goods,fieldName,new SimpleDateFormat("yyyy-MM-dd").parse(value)); continue; } BeanUtils.setProperty(goods,fieldName,value); /*Class type=clazz.getDeclaredField(fieldName).getType();//获得属性的类型的类对象 String name; setName(String name) Method method=clazz.getDeclaredMethod("set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1),type); method.invoke(goods,value);*/ }else{ //上传文件 String filename=items.getName();//上传文件名-->后缀 if(filename.length()>0) { //上传文件的存放位置/将存放文件的地址存入到数据库 String path = this.getServletContext().getRealPath("/");//服务器的根路径 File file = new File(path + "/upload");//准备存放上传文件的位置 if (!file.exists()) { file.mkdir();//创建目录 } filename = filename.substring(filename.lastIndexOf("."));//aaaa.png filename = UUID.randomUUID().toString() + filename; file = new File(file + "/" + filename); items.write(file);//将文件写出 /upload/dfdsf89sfdsfdsf-dfdfdf.jpg BeanUtils.setProperty(goods, fieldName, "/upload/" + filename);//将地址写入数据库的字段中 } } } //将goods传给业务层 int res=0 ; if(goods.getGid()==null) { res=goodsService.add(goods);//update(goods) }else { res=goodsService.update(goods); } if(res==1){ resp.sendRedirect("list.html"); }else{ resp.sendRedirect("err.html"); } } catch (Exception e) { e.printStackTrace(); } }
方法2
Map<String,String> map = new HashMap<>(); // 1. 创建DiskFileItemFactory对象 DiskFileItemFactory dfif = new DiskFileItemFactory(); // 2. 使用DiskFileItemFactory对象作为参数创建ServletFileUpload对象 ServletFileUpload sfu = new ServletFileUpload(dfif); try { List<FileItem> list = sfu.parseRequest(request); for (FileItem fi : list) { if(fi.isFormField()) { map.put(fi.getFieldName(), fi.getString()); }else { String path = getServletContext().getRealPath("picture"); System.out.println(path); File f = new File(path); if(!f.exists()) { f.mkdirs(); } String name = fi.getName(); // System.out.println(name); name = name.substring(name.lastIndexOf(File.separator) + 1); // System.out.println(name); File file = new File(path, name); fi.write(file); } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } String stid = map.get("tid"); int tid = stid==null?0:Integer.parseInt(stid); String pid = map.get("pid"); System.out.println(pid); String pname = map.get("pname"); String soprice = map.get("oprice"); double oprice =soprice==null?0:Double.parseDouble(soprice); String snprice = map.get("nprice"); Double nprice =soprice==null?0:Double.parseDouble(snprice); String head = map.get("head"); String gname1 = map.get("gname1"); String gdesc1 = map.get("gdesc1"); Imgs imgs1 = new Imgs(); imgs1.setGdesc(gdesc1); imgs1.setGname(gname1); imgs1.setPid(pid); String gname2 = map.get("gname2"); String gdesc2 = map.get("gdesc2"); Imgs imgs2 = new Imgs(); imgs2.setGdesc(gdesc2); imgs2.setGname(gname2); imgs2.setPid(pid); String gname3 = map.get("gname3"); String gdesc3 = map.get("gdesc3"); Imgs imgs3 = new Imgs(); imgs3.setGdesc(gdesc3); imgs3.setGname(gname3); imgs3.setPid(pid); List<Imgs> list =new ArrayList<>(); if(imgs1!=null|gdesc1!=null) { list.add(imgs1); } if(imgs2!=null|gdesc2!=null) { list.add(imgs2); } if(imgs3!=null|gdesc3!=null) { list.add(imgs3); } for (Imgs imgs : list) { System.out.println(imgs.toString()); } Product product = new Product(pid,tid, pname, oprice, nprice, list,head); boolean bl = ips.insertProduct(product); if (bl) { response.getWriter().write("新增成功"); }else { response.getWriter().write("新增失败"); } }
日志
log4J
log4j.rootLogger=debug, abc, F
log4j.logger.com.james.dao=TRACE
log4j.appender.abc=org.apache.log4j.ConsoleAppender
log4j.appender.abc.layout=org.apache.log4j.PatternLayout
log4j.appender.abc.layout.ConversionPattern=%-7p [%t] - %m%n
log4j.appender.F = org.apache.log4j.DailyRollingFileAppender
log4j.appender.F.File =mybatis.log
log4j.appender.F.Append = true
log4j.appender.F.Threshold = DEBUG
log4j.appender.F.layout=org.apache.log4j.PatternLayout
log4j.appender.F.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss}-[%p %F\:%L] %m%n
mysql
数据库连接信息
1.解释
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/xiaomi1?characterEncoding=utf8 //jdbc:mysql://localhost:3306/xiaomi1?useSSL=true&serverTimezone=UTC&characterEncoding=UTF-8 username=root password=19980719
2.复制
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/#?characterEncoding=utf8 username=root password=19980719
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/car?characterEncoding=utf8 jdbc.username=root jdbc.password=19980719
时间转换工具类
1.解释
public class DateUtil { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); /** * 将指定格式表示日期的字符串转换为日期对象 * @param dateStr 表示指定格式的日期字符串 * @return 该字符串对应的日期对象 */ public static java.util.Date str2Date(String dateStr){ try { return sdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 将日期对象转换为指定格式的字符串 * @param d 要转换的日期对象 * @return 表示日期的字符串 */ public static String date2Str(java.util.Date d) { return sdf.format(d); } /** * 将util包下的日期对象转换为sql包下的日期对象 * * @param d * @return */ public static java.sql.Date util2SQLDate(java.util.Date d){ return new java.sql.Date(d.getTime()); } }
2.复制
public class DateUtil { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public static java.util.Date str2Date(String dateStr){ try { return sdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return null; } public static String date2Str(java.util.Date d) { return sdf.format(d); } public static java.sql.Date util2SQLDate(java.util.Date d){ return new java.sql.Date(d.getTime()); } }
JDBC原生六步
1.解释
2.复制
druid-API封装
1.解释
public class DBUtil { private static ThreadLocal<Connection> tl = new ThreadLocal<>(); private static DruidDataSource dds = null; static { try { dds = (DruidDataSource) DruidDataSourceFactory.createDataSource(Env.getInstance()); } catch (Exception e) { e.printStackTrace(); } } public static DataSource getDataSource() { DataSource createDataSource = DruidDataSourceFactory.createDataSource(Env.getInstance()); DruidDataSource ds = (DruidDataSource) createDataSource; return ds; } /** * 获取数据库连接对象 * @return 数据库连接对象 * 进一步修改 */ public static Connection getConn() { Connection conn =null; conn = tl.get(); try { conn = dds.getConnection(); tl.set(conn); } catch (SQLException e) { e.printStackTrace(); } return conn; } //开启事务 public static void begin() { Connection conn = getConn(); try { conn.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } } //提交事务 public static void commit() { Connection conn = getConn(); try { conn.commit(); } catch (SQLException e) { e.printStackTrace(); } } //回滚事务 public static void rollback() { Connection conn = getConn(); try { conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } } }
2.复制
public class DBtools { private static DruidDataSource dataSource; static{ Properties properties=new Properties(); try { properties.load(DBtools.class.getClassLoader().getResourceAsStream("db.properties")); dataSource=(DruidDataSource) DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static DataSource getDataSource(){ return dataSource; } }
mybatis-API封装
1.解释
public class SqlSessionTools { }
2.复制
public class SqlSessionTools { private static SqlSessionFactory build; private static SqlSession sqlSession; static { try { build = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession() { sqlSession = build.openSession(); return sqlSession; } public static void commit() { sqlSession.commit(); sqlSession.close(); } }
Spring内置
1.解释
2.复制
MyBatis
XML配置
1.解释
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> 1. //添加配置文件 <properties resource="db.properties"/> 2. //日志设置---mybatis自带的日志,打印持久层的SQL语句 <settings> <settings name="logImg" value="STDOUT_LOGGING"/> <settings> 3. //给类型添加别名 <typeAliases> //一次添加一个别名 <typeAlias type="com.qf.pojo.Goods" alias="good"/> //添加一个包下的别名 <package name="com.qf.pojo" /> </typeAliases> //基本配置 <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> //管理映射元文件:mapper --idea工程中定义在resources目录下 <mappers> <!--添加Mapper.xml的管理--> <mapper resource="mapper/GoodsMapper.xml"/> <!--<mapper resource="mapper/OrderrMapper.xml"/>--> <!--添加接口的管理--> //直接在接口中使用注解方式实现SQL语句,无需对应的Mapper.xml,所以注册接口文件 <package name="com.qf.mapper"/> </mappers> </configuration>
2.复制
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="#"/> </mappers> </configuration>
映射元文件(mapper)
1.解释
1.一般采用接口和xml的形式实现
- -idea工程中定义在resources目录下
<?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="#"> ---//接口全路径 ------------ORM映射关系--->一对一---------- <resultMap id=" " type=""> </resultMap> <select id="" ></select> </mapper>
2.复制
<?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="#"> </mapper>
Spring
XML配置
1.解释
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--IOC反转控制/DI--> <!--spring容器创建对象--> <bean id="orderService" class="com.qf.service.impl.OrderServiceImpl"/> <bean id="orderService2" class="com.qf.service.impl.OrderServiceImpl"/> <!--<bean class="OrderMapperImpl"/>--> <!--读取到mybatis--> </beans>
1.1 核心类
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("spring.xml"); orderService=(OrderService)application.getBean("orderService");
2.复制
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
SpringMVC
目录结构
依赖目录
lombok 1.18.2 --需要sroce标签
junit 4.11
jstl 1.2 --使用jsp时导入
Spring-webmvc 4.3.6
Spring-jdbc 4.3.6
mybatis 3.4.4
mybatis-Spring 1.3.2
druid 1.1.10
mysql-connector 5.1.41
Servlet-api --需要sroce标签
XMl配置
service_mybatis 3
1.解释
步骤 <!--1.加载Properties--> <context:property-placeholder location="classpath:res/db.properties"/> <!--2.加载数据源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--3.配置MyBatis, mybatis 交给spring管理 将本来写在mybatis文件中的配置信息交由spring管理--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--加载数据源的Id--> <property name="dataSource" ref="dataSource"/> <!--取别名,鸡肋,可以选择不配,在mapper.xml文件中使用全路径--> <property name="typeAliasesPackage" value="com.hf.pojo"/> <!--配置mybatis映射文件加载地址--> <property name="mapperLocations" value="classpath:mapping/*.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--加载mapper中的接口(相当于接口)--> <property name="basePackage" value="com.hf.mapper"/> <!--加载mybatis的配置id--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
2.复制
<?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" xsi:schemaLocation="http://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"> <context:property-placeholder location="classpath:res/db.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.hf.pojo"/> <property name="mapperLocations" value="classpath:mapping/*.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.hf.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
service_service 1
1.解释
<!--监听service层--> <context:component-scan base-package="com.hf.service"/>
2.复制
<?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" xsi:schemaLocation="http://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"> <context:component-scan base-package="com.hf.service"/> </beans>
springmvc 5
1.解释
<!--监听controller层--> <content:component-scan base-package="com.hf.controller"/> <!--spring-mvc 启用注解方式--> <!-- 提供Controller请求转发,json自动转换等功能 --> <mvc:annotation-driven/> <!-- 1.在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。--> <mvc:default-servlet-handler /> <!--拦截器配置 拦截器可以配置多个--> <mvc:interceptors> <mvc:interceptor> <!–配置拦截路径–> <mvc:mapping path="/actor/*"/> <bean class="com.lyc.interceotors.MyAuthInterceptor"/> </mvc:interceptor> </mvc:interceptors> <!--视图解析起--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!--资源地址映射器--> <mvc:resources mapping="/js/**" location="/WEB-INF/static/js/"/> <mvc:resources mapping="/css/**" location="/WEB-INF/static/css/"/> <mvc:resources mapping="/images/**" location="/WEB-INF/static/images/"/> <mvc:resources mapping="/picture/**" location="/WEB-INF/static/picture/"/> <!--引入配置好的spring-mybatis.xml文件--> <import resource="classpath:spring-mybatis.xml"/>
2.复制
<?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:content="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <content:component-scan base-package="com.hf.controller"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <mvc:resources mapping="/js/**" location="/WEB-INF/static/js/"/> <mvc:resources mapping="/css/**" location="/WEB-INF/static/css/"/> <mvc:resources mapping="/images/**" location="/WEB-INF/static/images/"/> <mvc:resources mapping="/picture/**" location="/WEB-INF/static/picture/"/> </beans>
web.xml 4
1.解释
<web-app> <!--整合配置整合spring和mybatis的全局变量上下文--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> </context-param> <!--spring自带的过滤器,filter优先级高于servlet,如果filter在servlet下面,web-app变红--> <filter> <filter-name>characterFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- 设置过滤器属性 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!-- 启动过滤器 --> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 过滤所有请求 --> <filter-mapping> <filter-name>characterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--配置侦听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--核心处理器:所有URL请求都将被Spring MVC的DispatcherServlet截获--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--如果不配置<init-param> 默认在WEB-INF下查找springmvc.xml文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。 2)它的值必须是一个整数,表示servlet应该被载入的顺序 3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet; 4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。 5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。 6)当值相同时,容器就会自己选择顺序来加载。 --> <load-on-startup>1</load-on-startup> </servlet> <!--servlet mapper 配置servlet映射--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- <url-pattern>/</url-pattern>与<url-pattern>/*</url-pattern>的区别 <url-pattern>/</url-pattern> 看官方文档可知,果我们的项目中配置了"/", 会覆盖掉tomcat中的默认servlet,当其他的url-pattern匹配不上时都会走这个servlet ,它会匹配到后缀型url,它除了能够处理静态资源如“.js”,“.css”,".png"等, 还能够处理HTTP缓存请求,媒体(音频/视频)数据流和文件下载简历。 说到为什么JSP页面的请求(*.jsp)并不会命中这个servlet,那是因为当有这种url请求时 ,servlet容器内建的JSP servlet将会被调用,而这个容器内建的JSP servlet已经默认地映射在了*.jsp上。 <url-pattern>/*</url-pattern> 这种形式将会覆盖所有其它的servlet。 不管你发出了什么样的请求,最终都会在这个servlet中结束。因此,对于servlet来说, 这是一个很糟糕的URL模式。通常来讲,你只会想要在一个Filter中使用这种模式。 它可以通过调用doFilter()方法来使请求继续。 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
2.复制
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> </context-param> <filter> <filter-name>characterFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <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>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
核心注解
service层
1.解释
//扫描service层 @Service(value="IProductImgsService") //Bean的注入 ---Dao的实现类 @Resource ProductImgsMapper pim;
2.复制
@Service(value="#") @Resource
controller层
1.解释
//扫描controller层 1. @Controller ---->返回的是视图 2. @ResController ----->返回的json字符串//自动将对象转换为字符串 //二者选其一 // Bean的注入--service的实现类 1. @Qualifier(value="IProductService") 2. @Autowired private IProductService ips; //方法地址的映射路径 1. @RequestMapping(value="/list",method= RequestMethod.GET) 2. @GetMapping(value="/list")
返回视图
ModelAndView
public ModelAndView show1(){ //获取数据列表 List<Product> list = new ArrayList<Product>(); list= productService.getProductList(); //定义返回对象 ModelAndView modelAndView = new ModelAndView(); //设置返回数据 modelAndView.addObject("productList",list); //设置返回页面 //两种构造器 1.setViewName(String) modelAndView.setViewName("/static/productList.jsp"); 2.SetViewName(View) View view = new InternalResourceVIew("/static/productList.jsp"); modelAndView.setVIewName(view) return modelAndView; }
Model
@Controller // 加入到IOC容器 //@RequestMapping(value="/topic") public class TopicAction @Resource(name = "topicServiceImpl") private TopicService topicService; @RequestMapping(value="/index") public String show2(Model model){ List<Topic> topicList = topicService.getAllTopicList(); model.addAttribute("topics", topicList); return "index.jsp"; } }
转发方式
// 转发一 @RequestMapping("/test") public String test(Model model){ model.addAttribute("msg","ModelTest1"); return "WEB-INF/views/test.jsp"; } // 转发二 @RequestMapping("/test1") public String test1(Model model){ model.addAttribute("msg","ModelTest1"); return "forward:/WEB-INF/views/test.jsp"; } // 重定向 @RequestMapping("/test2") public String test2(Model model){ model.addAttribute("msg","ModelTest2"); return "redirect:/index.jsp"; }
Map
public String show2 (Map map){ map.put("key",value) }
Void
public void show4(HttpServletRequest,HttpServletResponse){ request.setAttribute("key",value); request.getSession(); request.getRequestDispatcher(" ").forward(request,response); response.sendRedirect(" "); }
返回JSON字符串
@RestController public class CarController { @Autowired ICarService ics; @GetMapping(value = "/findAllCars") public List<Car> findAllCar() { List<Car> allCar = ics.findAllCar(); return allCar; }
SpringBoot
目录结构
Maven
依赖解释
<----->Web项目<----->
<packaging>war</packaging>
<dependencies>
</dependencies>
Tomcat配置文件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerVersion>1.8</compilerVersion>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
log4j
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
分页插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
Spring依赖
1 解释
2.复制
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.6.RELEASE</version> </dependency>
SpringMVC依赖
1 解释
2.复制
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.6.RELEASE</version> </dependency>
Mybatis-Spring依赖
1 解释
2.复制
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency>
Spring-jdbc依赖
1 解释
2.复制
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.6.RELEASE</version> </dependency>
Mybatis依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
MYSQL依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
lombok依赖
1 解释
@Data ///get、set方法 @NoArgsConstructor //无参构造器 @AllArgsConstructor //全参构造器 @RequiredArgsConstructor //对对象的读入--反序列化/写出--序列化;要实现序列化和反序列化的对象,必须实现序列化接口; public class User implements Serializable { private Integer uid; @NonNull //选定构造器 private String uname; private String upass; private Date birth; private String sex; private String tel; private String email; private List<Orders> olist;
2.复制
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
Druid依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.24</version>
</dependency>
JUnit依赖
生命周期
@Before public void before(){ } @After public void after(){ }
2.复制
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
jsp标签库依赖
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
Servlet依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
JSON依赖
1.解释
@JSONField(format = "yyyy-MM-dd") private Date pubdate;
复制
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <!-- jackson --> <!-- 默认springMVC不提供对象转json操作,若controller直接返回对象,会报错 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>
依赖
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
反射依赖
1.解释
BeanUtils.setProperty(goods,fieldName,value); /*Class type=clazz.getDeclaredField(fieldName).getType(); //获得属性的类型的类对象 String name; setName(String name) Method method = clazz.getDeclaredMethod("set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1),type); method.invoke(goods,value);*/
2.复制
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency>
文件上传依赖
1.解释
FileItemFactory fileItemFactory=new DiskFileItemFactory();
2.复制
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
Servlet项目依赖导入
<packaging>war</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> </dependencies>