项目配置笔记

项目配置

1.struct2配置

suruts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="default" extends="struts-default">
        <action name="register" class="loginRegisterAction.RegisterAction">
            <result name="success">/login.jsp</result>
            <result name="input">/register.jsp</result>
            <result name="error">/register.jsp</result>
        </action>
        <action name="login" class="loginRegisterAction.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="input">/login.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
    </package>

</struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
         version="4.0">
<!--    用来声明一个过滤器,使用该元素可以同时拦截多个请求的url-->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
<!--    用来指定与过滤器相关联的url-->
    截获所有的url
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

初始界面,按顺序查找欢迎界面
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
        <welcome-file>login1.jsp</welcome-file>
    </welcome-file-list>
    监听器
    <listener>
    <listener-class>org</listener-class>
</listener>
    
    
    <error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>
</web-app>

2.hibernate配置

1.hibernate接口

1.Configuration接口,sessionFactory,session,transaction,Query。
2.
3.

2.hinerbate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
</session-factory>
            1.驱动        
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        2.连接数据库
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/demo</property>
        3.配置数据库用户
       <property name="hibernate.connection.username">root</property>
        4.配置数据库密码
        <property name="hibernate.connection.password">123456</property>
        5.配置数据库方言(告诉hibernate使用的是mysql数据库)
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        6.配置jdbc连接池(最大连接池的数量)
        <property name="connection.pool_size">10</property>
        7.输出运行时生成的sql语句(在控制台)(格式化sql语句)
        <property name="show_sql">true</property>
		<property name="format_sql">true</property>
        8.列出所有的映射文件
        <mapping resource="org.hibernate.entity.User.hbm.xml">
9.注意:

在使用getcurrentsession的时候需要在hibernate.cfg.xml中配置
<property name = "hibernate_current_session_context_class">
    thread     //本地事务
</property>

<property name = "hibernate_current_session_context_class">
    jta        //全局事务
</property>
</session-factory>
</hibernate-configuration>

3.配置C3P0连接池

1.在hibernate.cfg.xml直接配置

        1.设置C3P0连接池的最大数量
        <property name="hibernate.c3p0.max_size">50</property>
        2.设置C3P0连接池的最小数量
        <property name="hibernate.c3p0.min_size">1</property>
        3.设置C3P0缓存statement的数量
        <property name="hibernate.c3p0.max_statements">60</property>
        4.设置C3P0连接池中的连接的超市时长,超时则抛出异常,单位为毫秒
        <property name="hibernate.c3p0.timeout">1000</property>

2.使用一个hibernate.properties来配置

hibernate.connection.drier_class = com.mysql.jdbc.Driver

hibernate.connection.

4.映射文件*.hbm.xml详解

1.映射文件结构

映射文件用于向hibernate提供将对象持久化到关系数据库中的相关信息,每个hibernate映射的机构基本都是相通的。根元素为下面可以包含很多的class元素,每一个class子元素对应一个持久化类的映射。

1.hibernate-mapping元素
<hibernate-mapping 
                   
package=""   <!---->
schema="" <!--指定数据库scheme名-->
auto-import="true|false" <!--指定是否可以再查询语言中使用费权限定类名-->
catalog="" <!--指定数据库catalog名-->
default-access="" <!--指定默认属性访问策略-->
default-cascade="" <!--默认联机方式-->
default-lazy="" <!--指定是否延迟加载-->

</hibernate-mapping>
2.class元素

元素拥来声明一个持久化的类。通过他可以定义java持久化类和数据表之间的映射关系

    <class name=""            <!--指定类名-->
           catalog=""   <!--指出数据库catalog(目录)的名字-->
           schema=""    <!--指出数据库的schema(架构)的名字-->
		   table=""     <!--指定映射的表名-->
dynamic-insert="true"   <!--指定用于insert的sql语句是否动态生成-->
dynamic-update="true"   <!--指定用于update的sql语句是否动态生成-->
>              
    </class>
2.映射标识属性
<id name="id" 
    columu=""       主键的名称
    >   <!- name属性:持久化类标识属性的名称->
</id>
<id name="id" 
    columu=""       主键的名称> 
     <generator class="identity">user_id_identity
         支持mysql数据库
    </generator>     
</id>
3.使用property元素映射普通属性
<property name="id"              持久化类的属性名 
column="id"                     持久化类属性名映射到数据库的列名
type="java.lang.String" />
<property name="id" 
update="true" 
insert="true" />

5.hibernate的核心接口

1.configuration类
2.sessifactry接口
//1.加载文件
        Configuration cfg = new Configuration().configure();
        //2.创建一个sessionfactory;
        SessionFactory sessionfactory = cfg.buildSessionFactory();
        //3.创建session对象.sesssion类似于connection
        Session session = sessionfactory.openSession();
        Session session02 = sessionfactory.getCurrentSession();//两种创建对象的方法
        //4.开启事务
        Transaction tx = session.beginTransaction();
        //5.执行相关操作
        User c = new User(20, "田江南", "88");
        session.save(c);
        //6.事务提交
        tx.commit();
        //7.释放资源
        session.close();

opensession和getcurresession方法的区别:

1.opensession 方法sessionfactor会直接创建一个新的session实例。而getcurrentsession创建的实例会被绑在当前的线程中取

2.opensession创建的实例,再方法使用后需要close关闭。getcurrentsession创建的实例会在事务回滚或者提交操作的时候会自动关闭。

注意:

在使用getcurrentsession的时候需要在hibernate.cfg.xml中配置
<property name = "hibernate_current_session_context_class">
    thread     //本地事务
</property>

<property name = "hibernate_current_session_context_class">
    jta        //全局事务
</property>
3.session接口
1.session简介

session对象的生命周期一transaction对象事务的开始和结束为边界。

2.session的特点

不是线程安全的,设计框架的时候要避免多个线程共享一个session

实例是轻量级的,实例的创建和销毁不需要太多的资源

偶一个缓存,及hibernate的第一级缓存,用于存放在当前工作单元加载对象

3.常用的session操作方法
//save方法
//1.加载文件
Configuration cfg = new Configuration().configure();
//2.创建一个sessionfactory;
SessionFactory sessionfactory = cfg.buildSessionFactory();
//3.创建session对象.sesssion类似于connection(使用opensession方法)
Session session = sessionfactory.openSession();
//得到session对象之后就可以对其操作了


User user = new user();
User.setId = 1;
User.setName = "s";
User.setPassword = "sdsd";
        //4.开启事务
        Transaction tx = session.beginTransaction();
        //5.执行相关操作
        //User c = new User(20, "田江南", "88");
        session.save(user);
        //6.事务提交
        tx.commit();
        //7.释放资源
        session.close();

实体对象的生命周期值得就是hibernate中的实体对象在整个应用中的存在状态

瞬时态,持久态,游离态。

1.hibernate不能对瞬时态的数据进行事务回滚操作

User user = new User();
User.setId = 1;
User.setName = "s";
User.setPassword = "sdsd";
//User对象处于瞬时态

2.持久态:对持久态对象所作的任何操作都将被hibernate持久化到数据库中去。

//创建瞬时态对象
User user = new User();//自动生成主键
User.setName = "s";
User.setPassword = "sdsd";
//User对象处于瞬时态
Session sessiong = sessionFactory.openSession();
Transaction tx = session.beginTransaction();//user变为游离态
session.save(user);//使用save,user变为持久态
tx.commit();//提交事务
session.close();//关闭session

持久化的对象总是与数据库中的数据对应,session的换存进行清理的时候,会同步跟新数据库。

3.游离态:当处于持久态的对象不再与session相关联的时,该对象就变成了游离态。

游离态的特征

游离态对象不与session相关联

update()方法

//update()方法
User user = new User();
User.setId = 1;
User.setName = "s";
User.setPassword = "sdsd";
Session sessiong = sessionFactory.openSession();
Transaction tx = session.beginTransaction();//user变为游离态
session.uodate(user);//使用save,user变为持久态
tx.commit();//提交事务
session.close();//关闭session

saveorupdate方法

当传入的对象是transient(瞬时)时,执行save方法,传入对象是detached(游离态)时执行update方法,传入的对象是persistent(持久态)直接返回。


delete方法

做用是删除实例所有对应的数据库中的记录,相当于执行数据库中的delete语句session的delete主要完成了以下任务:

如果传入的对象不是persistent状态,name需要将删除的对象与session实例相关联,让其变为持久态

生成计划执行delete语句

User user = new User();
user.setId = 1;
Session sessiong = sessionFactory.openSession();
Transaction tx = session.beginTransaction();//user变为游离态
session.delete(user);
tx.commit();
session.close();

get()方法

通过标识符得到指定的持久化对象,如果对象不存在,则返回值为空

Session sessiong = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User)session.get(User.class,"1");
System.out.print(user.getId());
tx.commit();
session.close();

load()方法

session.clear();清空session的缓存

4.transaction接口

commit()事务提交和rollback()事务回滚

try{
    User user = new User();
    user.setName = "12";
    user.setPassword = "123456";
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.save(user);
    tx.commit();
    session.close();
}catch(Exception e){
    tx.rollback();
}

3.jsp配置/Servlet

文件必备信息

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags" %>
解决页面中文乱码问题
       <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>

4.数据库

1.数据库时区问题

usersSET GLOBAL time_zone='+8:00';

2.连接数据库

5.mybatis配置

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.20</version>
    </dependency>
编写mybatis的核心配置文件

<?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核心配置文件-->
<configuration>
    <!--environments配置环境组-->
    <!--default默认环境-->
    <environments default="development">
        <!--environment单个环境-->
        <environment id="development">
            <!--transactionManager配置事务管理器-->
            <transactionManager type="JDBC"/>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UFT-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

工具类

package com.zsw.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

//sqlSessionFactory—>SessionFactory
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try{
//使用mybatis第一步、获取sqlSessionFactory对象
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch(IOException e) {
e.printStackTrace();
}
}//既然有了 SqlSessionFactory,顾名思义,我们就可以从中获得 SqlSession 的实例了。
// SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
// 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public static SqlSession getSqlSession(){
    return sqlSessionFactory.openSession();
}

1.编写实体类

2.编写核心配置文件

3.编写接口

4.编写mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.BookMapper">
   <!--增加一个Book-->
   <insert id="addBook" parameterType="Books">
      insert into ssmbuild.books(bookName,bookCounts,detail)
      values (#{bookName}, #{bookCounts}, #{detail})
   </insert>
</mapper>

6.spring配置

核心配置文件:applicationContext.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">
    <context:annotation-config/>
    开启注解
</beans>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
<!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 注入sqlSessionFactory -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <!-- 给出需要扫描Dao接口包 -->
    <property name="basePackage" value="com.zsw.dao"/>
</bean>

7.SpringMVC

1.DispatcherServlet

    <!--1.注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
            建议使用classpath:
        </init-param>
        <!--启动级别-1  /    与服务器同时启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <context:component-scan base-package="com.zsw.controller"/>
    <mvc:default-servlet-handler />
<!--    过滤静态资源-->
    <mvc:annotation-driven />
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2、springmvc配置解决乱码问题的过滤器!

<filter>
   <filter-name>encoding</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>
</filter>
<filter-mapping>
   <filter-name>encoding</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

3.自定义过滤器

package com.kuang.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
* 解决get和post请求 全部乱码的过滤器
*/
public class GenericEncodingFilter implements Filter {

   @Override
   public void destroy() {
  }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       //处理response的字符编码
       HttpServletResponse myResponse=(HttpServletResponse) response;
       myResponse.setContentType("text/html;charset=UTF-8");

       // 转型为与协议相关对象
       HttpServletRequest httpServletRequest = (HttpServletRequest) request;
       // 对request包装增强
       HttpServletRequest myrequest = new MyRequest(httpServletRequest);
       chain.doFilter(myrequest, response);
  }

   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
  }

}

//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {

   private HttpServletRequest request;
   //是否编码的标记
   private boolean hasEncode;
   //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
   public MyRequest(HttpServletRequest request) {
       super(request);// super必须写
       this.request = request;
  }

   // 对需要增强方法 进行覆盖
   @Override
   public Map getParameterMap() {
       // 先获得请求方式
       String method = request.getMethod();
       if (method.equalsIgnoreCase("post")) {
           // post请求
           try {
               // 处理post乱码
               request.setCharacterEncoding("utf-8");
               return request.getParameterMap();
          } catch (UnsupportedEncodingException e) {
               e.printStackTrace();
          }
      } else if (method.equalsIgnoreCase("get")) {
           // get请求
           Map<String, String[]> parameterMap = request.getParameterMap();
           if (!hasEncode) { // 确保get手动编码逻辑只运行一次
               for (String parameterName : parameterMap.keySet()) {
                   String[] values = parameterMap.get(parameterName);
                   if (values != null) {
                       for (int i = 0; i < values.length; i++) {
                           try {
                               // 处理get乱码
                               values[i] = new String(values[i]
                                      .getBytes("ISO-8859-1"), "utf-8");
                          } catch (UnsupportedEncodingException e) {
                               e.printStackTrace();
                          }
                      }
                  }
              }
               hasEncode = true;
          }
           return parameterMap;
      }
       return super.getParameterMap();
  }

   //取一个值
   @Override
   public String getParameter(String name) {
       Map<String, String[]> parameterMap = getParameterMap();
       String[] values = parameterMap.get(name);
       if (values == null) {
           return null;
      }
       return values[0]; // 取回参数的第一个值
  }

   //取所有值
   @Override
   public String[] getParameterValues(String name) {
       Map<String, String[]> parameterMap = getParameterMap();
       String[] values = parameterMap.get(name);
       return values;
  }
}

4.json的乱码问题

springmvc-servlet.xml

<!--    解决乱码问题-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

8、文件的上传与下载

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
<!--servlet-api导入高版本的-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>
<!--文件上传配置-->
<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
   <property name="defaultEncoding" value="utf-8"/>
   <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
   <property name="maxUploadSize" value="10485760"/>
   <property name="maxInMemorySize" value="40960"/>
</bean>
package com.zsw.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
public class FileController {
    //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
    //批量上传CommonsMultipartFile则为数组即可
    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {

        //获取文件名 : file.getOriginalFilename();
        String uploadFileName = file.getOriginalFilename();

        //如果文件名为空,直接回到首页!
        if ("".equals(uploadFileName)){
            return "redirect:/index.jsp";
        }
        System.out.println("上传文件名 : "+uploadFileName);

        //上传路径保存设置  UUID
        String path = request.getServletContext().getRealPath("/upload");
        //如果路径不存在,创建一个
        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdir();
        }
        System.out.println("上传文件保存地址:"+realPath);

        InputStream is = file.getInputStream(); //文件输入流
        OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流

        //读取写出
        int len=0;
        byte[] buffer = new byte[1024];
        while ((len=is.read(buffer))!=-1){
            os.write(buffer,0,len);
            os.flush();
        }
        os.close();
        is.close();
        return "redirect:/index.jsp";
    }
    @RequestMapping("/upload2")
    public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {

        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload2");
        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdir();
        }
        //上传文件地址
        System.out.println("上传文件保存地址:"+realPath);

        //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
        file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));

        return "redirect:/index.jsp";
    }
    @RequestMapping(value="/download")
    public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{
        //要下载的图片地址
        String  path = request.getServletContext().getRealPath("/upload2");
        String  fileName = "日常吐槽.txt";

        //1、设置response 响应头
        response.reset(); //设置页面不缓存,清空buffer
        response.setCharacterEncoding("UTF-8"); //字符编码
        response.setContentType("multipart/form-data"); //二进制传输数据
        //设置响应头
        response.setHeader("Content-Disposition",
                "attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));

        File file = new File(path,fileName);
        //2、 读取文件--输入流
        InputStream input=new FileInputStream(file);
        //3、 写出文件--输出流
        OutputStream out = response.getOutputStream();

        byte[] buff =new byte[1024];
        int index=0;
        //4、执行 写出操作
        while((index= input.read(buff))!= -1){
            out.write(buff, 0, index);
            out.flush();
        }
        out.close();
        input.close();
        return null;
    }
}

工具

1.lombok

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

方便写实体类pojo。

@Data
@AllArgsConstructor   有参构造
@NoArgsConstructor    无参构造

2.日志

1.依赖

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2.log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=【%c】-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=【%p】【%d{yy-MM-dd}】【%c】%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

3.junit

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

4.maven的资源过滤

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

5.jackson

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

JsonUtil

package com.zsw.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import javafx.beans.binding.ObjectExpression;

import java.text.SimpleDateFormat;

public class JsonUtil {
    public static String getJson(Object object){
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }
    public static String getJson(Object object, String dateformat) {
        ObjectMapper mapper = new ObjectMapper();
        //不使用时间戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定义日期格式对象
        SimpleDateFormat sdf = new SimpleDateFormat("dateformat");
        //指定日期格式
        mapper.setDateFormat(sdf);
        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

6、fastjson

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.60</version>
</dependency>

用法:

public class FastJsonDemo {
   public static void main(String[] args) {
       //创建一个对象
       User user1 = new User("秦疆1号", 3, "男");
       User user2 = new User("秦疆2号", 3, "男");
       User user3 = new User("秦疆3号", 3, "男");
       User user4 = new User("秦疆4号", 3, "男");
       List<User> list = new ArrayList<User>();
       list.add(user1);
       list.add(user2);
       list.add(user3);
       list.add(user4);

       System.out.println("*******Java对象 转 JSON字符串*******");
       String str1 = JSON.toJSONString(list);//转为json字符串
       System.out.println("JSON.toJSONString(list)==>"+str1);
       String str2 = JSON.toJSONString(user1);
       System.out.println("JSON.toJSONString(user1)==>"+str2);

       System.out.println("\n****** JSON字符串 转 Java对象*******");
       User jp_user1=JSON.parseObject(str2,User.class);
       System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);

       System.out.println("\n****** Java对象 转 JSON对象 ******");
       JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
       System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));

       System.out.println("\n****** JSON对象 转 Java对象 ******");
       User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
       System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
  }
}

7、bootSchool

https://www.bootschool.net/

注解

1.Test

2.@Autowired

配合使用,自动装配并制定特定的值

@Autowired
@Qualifier(value = "dog1")

3.@Resource

【第二种装配方式】

@Resouce(name = “cat1”)

区别:

@autowird和@resouce用来自动装配,都可以放在属性字段上

@autowired通过byType的凡是实现,这个方法的对象必须存在。【常用】

@resource默认通过byName的方式实现,如果找不到名字,则通过byType实现,如果两个都找不到,就报错!【常用】

执行顺序不同。

4.@Controller

springmvc的控制器。代表这个类会被spring接管,这个注解的类中的所有方法,如果返回的值是string,并且有具体的页面可以跳转,name就会被视图解析器解析。

5.@PathVariable

@Controller
public class RestFulController {
   //映射访问路径
   @RequestMapping("/commit/{p1}/{p2}")
   public String index(@PathVariable int p1, @PathVariable int p2, Model model){
       int result = p1+p2;
       //Spring MVC会自动实例化一个Model对象用于向视图中传值
       model.addAttribute("msg", "结果:"+result);
       //返回视图位置
       return "test";     
  }   
}

6.@RequestMapping

Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。

所有的地址栏请求默认都会是 HTTP GET 类型的。

方法级别的注解变体有如下几个:组合注解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@GetMapping 是一个组合注解,平时使用的会比较多!

它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

7.@ResponseBody

他就不会走视图解析器

public class UserController {
    //produces:指定响应体返回类型和编码
    @RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
    @ResponseBody//他就不会走视图解析器
    public String json1() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = new User("张善伟",3,"nan");
        String s = objectMapper.writeValueAsString(user);
        return s;
    }

8. @RestConcroller

表示该类下的所有方法都已json返回字符串,不走视图解析器

9.@ConfigurationProperties

//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = “spring.http”)

10.@Validated

@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated  //数据校验
public class Person {

    @Email(message="邮箱格式错误") //name必须是邮箱格式
    private String name;
}
运行结果 :default message [不是一个合法的电子邮件地址];

使用数据校验,可以保证数据的正确性; 

常见参数

@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;

空检查
@Null       验证对象是否为null
@NotNull    验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank   检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty   检查约束元素是否为NULL或者是EMPTY.
    
Booelan检查
@AssertTrue     验证 Boolean 对象是否为 true  
@AssertFalse    验证 Boolean 对象是否为 false  
    
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
@Length(min=, max=) string is between min and max included.

日期检查
@Past       验证 Date 和 Calendar 对象是否在当前时间之前  
@Future     验证 Date 和 Calendar 对象是否在当前时间之后  
@Pattern    验证 String 对象是否符合正则表达式的规则

.......等等
除此以外,我们还可以自定义一些数据校验规则

11.@Repository

service通过@Resource调用

example

@Repository
public interface UserMapper {
    
    @Resource(name = "userMapper")
    private UserMapper userMapper;

javaweb注意点

a href=" p a g e C o n t e x t . r e q u e s t . c o n t e x t P a t h / b o o k / d e l / {pageContext.request.contextPath}/book/del/ pageContext.request.contextPath/book/del/{book.getBookID()}">删除

绝对路径问题

参考视屏
狂神的一系列课程,是学习笔记,自己总结的项目配置的笔记。
连接太多,b站搜索狂神课程即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值