项目配置
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&useUnicode=true&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站搜索狂神课程即可。