关于项目开发技术方案

基本骨架:

  • 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.pngfilename = UUID.randomUUID().toString() + filename;file = new File(file + "/" + filename);items.write(file);//将文件写出  /upload/dfdsf89sfdsfdsf-dfdfdf.jpgBeanUtils.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=TRACElog4j.appender.abc=org.apache.log4j.ConsoleAppender
log4j.appender.abc.layout=org.apache.log4j.PatternLayout
log4j.appender.abc.layout.ConversionPattern=%-7p [%t] - %m%nlog4j.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 configurationPUBLIC "-//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 configurationPUBLIC "-//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的形式实现

  1. -idea工程中定义在resources目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 mapperPUBLIC "-//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>&lt;!&ndash;配置拦截路径&ndash;&gt;<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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://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的实现类
@ResourceProductImgsMapper pim;

2.复制

@Service(value="#")
@Resource

controller层

1.解释

//扫描controller层
1.   @Controller  ---->返回的是视图
2.   @ResController   ----->返回的json字符串//自动将对象转换为字符串  //二者选其一//  Bean的注入--service的实现类
1.  @Qualifier(value="IProductService")
2.   @Autowiredprivate 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 {@AutowiredICarService 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依赖
生命周期

@Beforepublic void before(){}@Afterpublic 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>

Java Web项目开发灵感和知识点总结相关推荐

  1. MyEclipse搭建java Web项目开发环境

    MyEclipse搭建java Web项目开发环境 首先,在开始搭建MyEclipse的开发环境之前,还有三步工具的安装需要完成,只要在安装配置成功之后才可以进入下面的java Web项目开发环境的搭 ...

  2. java web开发myeclipse_【java项目实战】一步步教你使用MyEclipse搭建java Web项目开发环境(一)...

    首先,在开始搭建MyEclipse的开发环境之前,还有三步工具的安装需要完成,只要在安装配置成功之后才可以进入下面的java Web项目开发环境的搭建. 1.安装工具 第一步,下载并安装JDK,到官网 ...

  3. 进行Java Web项目开发需要掌握的技术

    目前, 国内外信息化建设已经进入基于Web应用为核心的阶段, Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.概括一下,实施Ja ...

  4. Java Web项目开发流程

    1.Web项目开发流程图解 2.Web项目开发的细节(转载) 任何一个项目或者系统开发之前都需要定制一个开发约定和规则,这样有利于项目的整体风格统一.代码维护和扩展.由于Web项目开发的分散性.独立性 ...

  5. java项目如何单元测试_大家java web项目开发做单元测试吗?

    java web项目测试用Web的测试工具,如HtmlUnit,JWebUnit等. main()方法就可以测试,在main方法中获得connection对象将他输出就可以了. 如果正常输出一大串就是 ...

  6. 亮剑java web_为什么《亮剑Java Web 项目开发案例导航》第二个项目运行不了?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 大二学学生党一枚,吧里有人也在看吗?我调试了一周里面的 "飞达商贸POS系统"项目,总是在myeclicpse中发布失败,有近来运行过 ...

  7. JAVA Web项目开发SSM框架搭建(第一天)

  8. Java Web实战开发 | Web项目的创建与运行

    01Web项目的创建与运行 1●创建项目 在完成了IDE.Tomcat服务器以及数据库的安装后,Java Web项目开发集成环境已经准备就绪,可以进行Java Web应用系统的开发.下面通过例1-1讲 ...

  9. JAVA EE项目开发及应用实训报告——网上考试系统

    ** JAVA EE项目开发及应用实训 ** 题 目: 网上考试系统 系 别: 专 业: 学生姓名: 学 号: 指导教师: 题目类型:•理论研究 •实验研究 •工程设计 •工程技术研究 软件开发 • ...

最新文章

  1. 20165337岳源第一周学习总结
  2. java多语言标签如何动态刷新_WPF实现无刷新动态切换多语言(国际化)
  3. linux centos7完整记录对根目录的磁盘扩容过程(扩容99G)
  4. python time 时间戳_Python的time.time()返回本地或UTC时间戳吗?
  5. iis mysql_Windows10本地搭建IIS+PHP+MYSQL+phpMyAdmin运行环境图文教程(也可用于服务器)...
  6. 【今日CV 计算机视觉论文速览 第116期】Mon, 13 May 2019
  7. hibernate数据库连接池
  8. We change lives !
  9. DELETE_FAILED_INTERNAL_ERROR Error while Installing APK
  10. Chromium Embedded Framework中文文档 (SVN属性)
  11. 3.docker run / create
  12. 选择SEO服务时要注意的问题
  13. 数据库技术与应用课程设计-学生信息管理系统
  14. 现代经济中的货币创造
  15. 排序算法图解(一):冒泡排序与冒泡排序的优化
  16. 每周推荐短视频:道哥表达了对自动驾驶技术的感恩之情
  17. 盘点2017企业服务领域最受关注的100家厂商(BPM平台篇)
  18. thinkpad联想IBM笔记本为什么出现fan error
  19. [jQuery.FQcomputer] 分期商城汇率计算器
  20. 保护手机隐私最关键是提高全民信息安全意识

热门文章

  1. Windows7和Windows10设置屏保保护程序-冒泡
  2. 计算机金融学校排名2015,2015全国金融专业高校排名
  3. TOP10! KubeCon + CloudNativeCon最受欢迎演讲视频
  4. rust沙河游戏_十款特别好玩的沙盒建造游戏,喜欢生存建造的朋友千万不要错过...
  5. 经典金句,学会成高手
  6. python3.4.4教程_Python3基础教程四(个人整理
  7. 数学物理方法·基础⑤复数序列
  8. 数学物理方法·基础篇-学习主要内容
  9. JavaScript入门 轮播/表单验证 Day17
  10. OpenFOAM 量纲检查开启和关闭