习题
一、JDBC MySQL
0 、User
private int id;
private String userName;
private int userAge;
private String password;
1、JdbcUtil
package com.hisoft.jdbc.util;
import com.hisoft.jdbc.util.rowmapper.RowMapper;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JdbcUtil {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql:///newsmanagersystem?characterEncoding=utf-8";
private static final String ROOT = "root";
private static final String PASSWORD = "123456";
/**
* 1,加载驱动,获取数据库的连接
*
* @return
*/
public Connection getConnection() {
Connection conn = null;
try {
Class.forName(DRIVER);//加载驱动
conn = DriverManager.getConnection(URL, ROOT, PASSWORD);//获取url链接
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
/**
* 2 释放资源
*
* @param rs
* @param stat
* @param conn
*/
public void close(ResultSet rs, PreparedStatement stat, Connection conn) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
if (stat != null) {
stat.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
/**
* 增删改方法
* @param sql
* @param params
*/
//不定项参数 ,可以传任意个参数 param:参数 params[i]:代表地i个参数值
public void executeUpdate(String sql, Object... params) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
try {
conn = getConnection();//,加载驱动,获取数据库连接
stat = conn.prepareStatement(sql);//创建传输器
//遍历参数的?位置
for (int i = 0; i < params.length; i++) {
stat.setObject(i + 1, params[i]);
}
//修改操作
stat.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
//关闭资源
close(null, stat, conn);
}
}
/**
* 4 根据所传的参数查找单个对象
*
* @param sql
* @param rowMapper
* @param params
* @return
*/
public Object executeQueryForObject(String sql, RowMapper rowMapper, Object... params) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
Object obj = null;
try {
conn = getConnection();//获取数据库的连接
stat = conn.prepareStatement(sql);//获取传输器
//遍历参数?
for (int i = 0; i < params.length; i++) {
stat.setObject(i + 1, params[i]);
}
//获取结果集
rs = stat.executeQuery();
if (rs.next()) {
obj = rowMapper.queryObjectByRs(rs);//调用RowMapper的实现方法返回的是一个对象
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
close(rs, stat, conn);
return obj;
}
/**
* 查找所有用户
* @param sql
* @param rowMapper
* @param params
* @return
*/
public List<Object> executeQueryObjectList(String sql, RowMapper rowMapper, Object... params) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
Object obj = null;
List<Object> list = new ArrayList<>();
try {
conn = getConnection();
stat = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
stat.setObject(i + 1, params[i]);
}
rs = stat.executeQuery();
while (rs.next()) {
obj = rowMapper.queryObjectByRs(rs);
list.add(obj);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
close(rs, stat, conn);
return list;
}
}
返回首页
: 确定返回
2、UserDaoImpl
package com.hisoft.jdbc.dao.impl;
import com.hisoft.jdbc.dao.UserDao;
import com.hisoft.jdbc.entiy.User;
import com.hisoft.jdbc.util.JdbcUtil;
import com.hisoft.jdbc.util.rowmapper.Impm.BeanRowMapper;
import java.util.List;
public class UserDaoImpl implements UserDao {
JdbcUtil jdbcUtil = new JdbcUtil();
/**
* 1添加用户
* @param user
*/
@Override
public void saveUser(User user) {
String sql = "INSERT INTO USER (id,username,userage,PASSWORD) VALUES (?,?,?,?) ";
jdbcUtil.executeUpdate(sql, user.getId(), user.getUserName(), user.getUserAge(), user.getPassword());
}
/**
* 2 根据id删除用户
* @param id
*/
@Override
public void deleteUseById(int id) {
String sql = "DELETE FROM USER WHERE id = ?";
jdbcUtil.executeUpdate(sql, id);
}
/**
* 3 通过用户修改用户
* @param
*/
@Override
public void updateUserByUser(User user) {
String sql = "update user set username = ?,userage = ?,password = ? where id = ?";
jdbcUtil.executeUpdate(sql,user.getUserName(),user.getUserAge(),user.getPassword(),user.getId());
}
/**
* 5 根据id查找用户
* @param id
* @return
*/
@Override
public User queryUser(int id) {
String sql = "SELECT id, username AS userName,userage AS userAge,password FROM USER WHERE id = ?";
User user = (User) jdbcUtil.executeQueryForObject(sql, new BeanRowMapper<User>(User.class), id);
return user;
}
/**
*6 查找所有用户
* @return
*/
@Override
public List<User> queryAllUser() {
String sql = "SELECT id,username AS userName,userage AS userAge,password FROM USER";
List<User> userList = (List) jdbcUtil.executeQueryObjectList(sql, new BeanRowMapper<User>(User.class));//通过反射方法User.class不User对象传给BeanRowMapper
return userList;
}
}
3 、 RowMapper
:接口
返回首页
: 确定返回
package com.hisoft.jdbc.util.rowmapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public interface RowMapper<T> {
/**
* 通过结果集返回对象
* @param rs
* @return
*/
T queryObjectByRs(ResultSet rs) throws SQLException;
}
返回首页
: 确定返回
4 、BeanRowMapper
:实现RowMapper接口
package com.hisoft.jdbc.util.rowmapper.Impm;
import com.hisoft.jdbc.util.rowmapper.RowMapper;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class BeanRowMapper<T> implements RowMapper<T> {
private Class<T> clazz;//定义实例类型
// 创建一个BeanRowMapper构造方法,↑ 为了new BeanRowMapper()的时候可以传进来你想要的对象,如:new BeanRowMapper<User>(User.class)//通过反射(看CTest中有反射的说明)
public BeanRowMapper(Class<T> clazz) {
this.clazz = clazz;
}
/**
* Class反射方法查找对象
* @param rs
* @return
*/
@Override
public T queryObjectByRs(ResultSet rs) throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();//获取原结果的数据集
T obj = null;
try {
obj = clazz.getDeclaredConstructor().newInstance();//获取clazz实例,通过反射方法 例:User.class 则可以获取到User对象
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
int columnCount = metaData.getColumnCount();//获取查询的列数
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);//获取和实体类属性名相匹配的列名(表中的列名和实体类中的不同的话要表列名要把别名(AS)改成相同的)
String setMethod = "set" + columnName.substring(0,1).toUpperCase() + columnName.substring(1);//拼接set方法 如:setUserName()
System.out.println(setMethod);
//执行set方法
Method[] methods = clazz.getMethods();//获取当前类的所有方法,返回的是一个数组
for(Method method : methods){
String methodName = method.getName();//获取方法名
if(methodName.equals(setMethod)){
try {
//开始执行setMethod方法
method.invoke(obj,rs.getObject(columnName));//getObject(columnName):获取实体类中的参数类型userName(也就是setUserName(String userName))
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
return obj;
}
}
返回首页
: 确定返回
5 、 UserTest
package com.hisoft.jdbc.test;
import com.hisoft.jdbc.dao.UserDao;
import com.hisoft.jdbc.dao.impl.UserDaoImpl;
import com.hisoft.jdbc.entiy.User;
import java.util.List;
public class UserTest {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
User user1 = new User(8, "网三", 33, "444");
userDao.saveUser(user1);//添加
User user2 = new User(4,"改名",22,"改密123");
userDao.updateUserByUser(user2);//修改
User user3 = userDao.queryUser(2);
System.out.println(user3.getUserName());//查单个对象
List<User> users = userDao.queryAllUser();//查全部对象
for(User user4 : users){
System.out.println(user4);
}
}
}
返回首页
: 确定返回
二 、验证码及重复登录问题
1 需要导入的jar包 。jqeury框架
如图:
2 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">
//<!-- jcaptcha验证码配置-->
<servlet>
<servlet-name>jcaptcha</servlet-name>
<servlet-class>com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jcaptcha</servlet-name>
<url-pattern>/jcaptcha.jpg</url-pattern>
</servlet-mapping>
</web-app>
3 web.FormServlet
@WebServlet("/form")//相当于xml中的配置servlet
public class FormServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String token = UUID.randomUUID().toString();
HttpSession session = req.getSession();
session.setAttribute("token", token);
req.setAttribute("token", token);
req.getRequestDispatcher("form.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String jcaptcha = request.getParameter("jcaptcha");
boolean captchaPassed = SimpleImageCaptchaServlet.validateResponse(request, jcaptcha);
if (captchaPassed) {
String money = request.getParameter("money");
String token = request.getParameter("token");
HttpSession session = request.getSession();
String sessionToken = (String) session.getAttribute("token");
if (token.equals(sessionToken)) {
session.removeAttribute("token");
System.out.println(session.getAttribute("token"));
request.setAttribute("money", money);
request.getRequestDispatcher("success.jsp").forward(request, response);
} else {
response.sendRedirect("massage.jsp");
}
}else{
response.sendRedirect("/form.jsp?errorCode=101");
}
}
}
4 form.jsp
//以下是jsp中的代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>$Title$</title>
//js/jquery-1.4.3.min.js这是导入的jquery框架
<script src="js/jquery-1.4.3.min.js" type="text/javascript"></script>
</head>
<body>
<c:if test="${param.errorCode == '101'}">
<script>
$(function(){
$("#errorId").show();//展示隐藏标签
$("#errorId").fadeOut(5000);//根据透明读变化让标签5秒后消失
})
</script>
</c:if>
<form action="/form" method="post">
请支付: <input type="text" name="money"/>
<input type="hidden" name="token" value="${sessionScope.token}"/>
<input type="text" name="jcaptcha"/>
<span id="errorId" style="color: red;display: none">验证码错误,请重新输入!</span>
<img src="/jcaptcha.jpg" id="captcha" width="80px" height="35px"/>
<a href="javascript:void(0)" id="aid">看不清,换一张</a>
<input type="submit" value="确定支付"/>
</form>
<script type="text/javascript">
$(function () {
$("#aid").click(function () {
// console.log( $("#jcapcha")).attr("src","/jcaptcha.jpg");
$("#captcha").attr("src","/jcaptcha.jpg")//修改img标签的src属性
});
});
</script>
</body>
</html>
5 web项目中的jsp
1. index.jsp 2. massage 3.success.jsp
//以下是jsp中的代码
%*********index.jsp*************%
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
response.sendRedirect("/form");
%>
%*********massage.jsp*************%
<body>
<h3>你已成功支付!请勿重复支付</h3>
</body>
%*********success.jsp*************%
<body>
<h3>恭喜你支付成功! 支付的金额为:${money}</h3>
</body>
三 、翻页分页问题
1 需要导入的jar包
图示:
2 NewsDao
public class NewsDao{
private JdbcUtile jdbcutil= new JdbcUtile();
public List<News> findAll(Integer pageNum){
int pageSize = 10;
int start = (pageNo-1)*pageSize;
String sql = "select nid,ntitle,nauthor,from news limit ?,?";
return dbHelp.executeQueryForList(sql,new BeanRowMapper<Book>(Book.class),start,pageSize);
}
}
3 web. NewsServlet
@WebServlet("/allNews")
public class NewsServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int page = Integer.valueOf(request.getParameter("page"));
NewsDao newsDao = new NewsDao();
List<News> newsList = newsDao.executeQueryNews(page);
request.setAttribute("newsList",newsList);
request.getRequestDispatcher("WEB-INF/views/newslist.jsp").forward(request,response);
}
}
4 newslist.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>$</title>
<link href="/css/bootstrap.min.css"/>
</head>
<body>
<div class="container">
<table class="table table-striped">
<tbody>
<c:forEach items="${newsList}" var="news">
<tr>
<td>${news.nTid}</td>
<td>${news.nTitle}</td>
<td>${news.nAuthor}</td>
</tr>
</c:forEach>
</tbody>
</table>
<nav aria-label="...">
<ul class="pager">
<li><a href="/allNews?page=1">首页</a></li>
<li><a href="/allNews?page=2">上一页</a></li>
<li><a href="/allNews?page=3">下一页</a></li>
<li><a href="/allNews?page=4">尾页</a></li>
</ul>
</nav>
</div>
</body>
</html>
四 、上传问题
1 需要的jar包
图示:
2 FileUploadServlet
package com.hisoft.web;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;
@WebServlet("/fileUpload")
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//判断当前提交的表单是不是一个文件表单
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
try {
//1 构建factory对象用于ServletFileUpload构造方法中,设置环境:创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//2 设置上传文件时用的临时空间 repository:仓库
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setSizeThreshold(1024);//设置临时空间大小
factory.setRepository(repository);
ServletFileUpload upload = new ServletFileUpload(factory);//2、核心操作类:创建一个文件上传解析器
upload.setSizeMax(1024 * 1024 * 20);//设置表单提交的所有内容的总长度
//获取表单中的所有控件 //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
String contentType = fileItem.getContentType();//获取上传的文件类型
String fieldName = fileItem.getFieldName();//获取控件name属性值
String name = fileItem.getName();//获取上传的文件的名字
long size = fileItem.getSize();//获取文件或文本的大小
if (fileItem.isFormField()) {//判断该表单是否为普通类型的表单
String values = fileItem.getString();//表单普通输入项的值
values = new String(values.getBytes("ISO8859-1"), "UTF-8");//解决普通输入项的数据的中文乱码问题
System.out.println(fieldName);
} else {//否:该表单项是file类型的
int index = name.lastIndexOf("."); //获取上传文件的后缀名.xxx
String suffixName = name.substring(index);//指定重.(index)出开始到结束 suffixName:后缀名
String randomName = UUID.randomUUID().toString();//生成唯一的文件名称
String newName = randomName + suffixName;//拼接上传路径。存放路径+上传的文件名后缀 唯一名.xxx
File directory = new File("D:/img");//构建目录
if (!directory.exists()) {//判断此目录是否存在
directory.mkdir();//没有则创建一个单层目录 ; mkdirs() 创建多层目录
}
File file = new File(directory, newName);//构建文件
InputStream is = fileItem.getInputStream();
OutputStream os = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024 * 1024];
BufferedOutputStream bos = new BufferedOutputStream(os);
int len = -1;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
bos.flush();
bos.close();
bis.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
//request.getRequestDispatcher("WEB-INF/views/file.jsp").forward(request, response);
//进入主页面的时候是get请求,这么设置可以让一开始主页显示的是自己想要的界面
}
}
3 FileUploadServlet3
三版本上传文件
@WebServlet("/upload3")
@MultipartConfig(maxRequestSize = 10000)//fileUpload三版本的文件上传做法,在这配置MultipartConfig
public class FileUploadServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String desc = request.getParameter("desc");
System.out.println(desc);
Collection<Part> parts = request.getParts();
int count = 1;
for (Part part : parts) {
if (part.getName().equals("myFile")) {
InputStream is = part.getInputStream();
OutputStream os = new FileOutputStream(new File("d:/img/" + count + ".jpg"));
int len = -1;
while ((len = is.read()) != -1) {
os.write(len);
}
is.close();
os.close();
count++;
}
}
}
}
4 file.jsp
<body>
<form action="/fileUpload" method="post" enctype="multipart/form-data">
文件描述:<input type="text" type="text" name="desc"/><br>
点击我文件上传:<input type="file" name="myFile"/><br>
<input type="submit" value="提交"/>
</form>
</body>
5 在浏览器展示文件或图片
etc目录 : filedir.properties
dir=d:/img/
A,路径名工具类 DirectoryUtil
public class DirectoryUtil {
private final static String FILE_DIR_PROPERTIES = "filedir.properties";
private final static String FILE_DIR_KEY = "dir";
public static String FILE_DIR = "d:/img/";
static {
try {
InputStream is = DirectoryUtil.class.getClassLoader().getResourceAsStream(FILE_DIR_PROPERTIES);
Properties properties = new Properties();
properties.load(is);
if (properties.getProperty(FILE_DIR_KEY) != null) {
FILE_DIR = properties.getProperty(FILE_DIR_KEY);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
B , UserShowServlet
@WebServlet("/img/show")
public class UserShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*String dir = DirectoryUtil.FILE_DIR;//借用路径名工具类的做法
File file = new File(dir + "c7d0ab25-6b8e-4db2-9a1f-162074a85875.jpg");*/
File file = new File("d:/img" + "/8290ed77-2792-4e09-baf4-1f3e41b19abc.jpg");
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024*1024];
OutputStream os = response.getOutputStream();
int len = -1;
while ((len = is.read(buffer)) != -1) {
os.write(buffer,0,len);
}
is.close();
os.close();
}
}
C,user.jsp
user.jsp页面一打开就会自动加载 热后走/img/show这个页面的Srvlet
<body>
<img src="/img/show" style="width: 300px; height: 200px"/>
</body>
五 、下载问题
1 需要的jar包
2 DownLoadServlet
@WebServlet("/fileDownload")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("multipart/form-data");
File file = new File("d:/img/QQ图片20210712002824.jpg");
//设置下载进度条
response.setContentLength(Long.valueOf(file.length()).intValue());
String fileName = file.getName();
//下载后文件名乱码问题 : 响应下载文件是以流的形式进行的,读取fileName的时候有可能是带有中文的,所以得把utf-8转为ISO8859-1
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
System.out.println(fileName);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
int len = -1;
while ((len = bis.read()) != -1) {
bos.write(len);
}
bis.close();
bos.close();
}
}
六 、乱码问题
idea字符集编码设置
1 请求乱码 控制台输出乱码
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//处理post请求,必须在第一行
String userName = request.getParameter("userName");
System.out.println(userName);//控制台输出请求乱码,VM options里加上-Dfile.encoding=utf-8
}
}
控制台乱码修改图示:
控制台乱码。 -Dfile.encoding=utf-8 打开help,点击Edit Custom VM Options 加上 -Dfile.encoding=utf-8 这一句话
2 响应乱码 流刷出,弹窗乱码
硬编码: String name = new String(name.getBytes("UTF-8"), "ISO8859-1")
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
System.out.println(name);
//String name = "张三丰";
//name = new String(name.getBytes("UTF-8"), "iso8859-1");//响应乱码解决方式1 硬编码
String encode = URLEncoder.encode(name, "utf-8");//响应乱码解决方式2 : 重写url
response.sendRedirect("/test.jsp?name=" + encode);
/*字节流刷出乱码问题*/
response.setContentType("text/html;charset=utf-8");//百度搜mime类型,setContextType(修改对应输出的mime类型)
PrintWriter writer = response.getWriter();
writer.println("<script>alert('刷出流')</script>");
writer.println("张三");
writer.flush();
writer.close();
}
3 form.jsp
<body>
<%--注意: href="/form?name=张三丰&code=101" ,form中的问号不能是中文的问号,否则地址栏url会乱码--%>
<a href="/form?name=张三丰&code=101" >跳转</a>
<form action="/form" method="post">
账号: <input type="text" name="userName" />
<input type="submit" value="登录"/>
</form>
</body>
七 、电子邮件问题
1 需要jar包
2 EmailUtil
package com.hisoft.util;
import org.apache.commons.mail.*;
import javax.mail.Multipart;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class EmailUtil {
private static String hostName = "smtp.163.com";
private static String userName = "yang7email@163.com";
private static String password = "ROBQTYBQTQVSQVNW";
private static String from = "yang7email@163.com";
private static String character = "UTF-8";
static {
try {
InputStream is = EmailUtil.class.getClassLoader().getResourceAsStream("email.properties");
Properties properties = new Properties();
properties.load(is);
if (properties.getProperty("email_hostName") != null) {
hostName = properties.getProperty("email_hostName");
}
if (properties.getProperty("email_userName") != null) {
userName = properties.getProperty("email_userName");
}
if (properties.getProperty("email_password") != null) {
password = properties.getProperty("email_password");
}
if (properties.getProperty("from") != null) {
from = properties.getProperty("from");
}
if (properties.getProperty("email_charset") != null) {
character = properties.getProperty("email_charset");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void sendTxtEmail(String toEmail, String subject, String content) {
Email email = new SimpleEmail();
email.setHostName(hostName);
email.setAuthentication(userName, password);
email.setCharset(character);
email.setTLS(true);
try {
email.setFrom(from);
email.setSubject(subject);
email.setMsg(content);
email.addTo(toEmail);
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
}
public static void sendHtmlEmail(String toEmail, String subject, String content) {
HtmlEmail email = new HtmlEmail();
email.setHostName(hostName);
email.setAuthentication(userName, password);
email.setCharset(character);
email.setTLS(true);
try {
email.setFrom(from);
email.setSubject(subject);
email.setHtmlMsg(content);
email.addTo(content);
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
}
public static void sendAttacheEmail(String path, String subject, String content) {
MultiPartEmail email = new MultiPartEmail();
EmailAttachment ea = new EmailAttachment();
ea.setPath(path);
email.setHostName(hostName);
email.setAuthentication(userName, password);
email.setCharset(character);
email.setTLS(true);
try {
email.setFrom(from);
email.setSubject(subject);
email.setMsg(content);
email.addTo(content);
email.attach(ea);
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
}
}
3 email.properties
email_hostName=smtp.163.com
email_userName=yang7email@163.com
email_password=ROBQTYBQTQVSQVNW
email_charset=UTF-8
email_from=yang7email@163.com
八 、连接池问题
1 db.porperties
db.driver=com.mysql.jdbc.Driver
db.user=root
db.password=123456
db.url=jdbc:mysql:///newsmanagersystem?characterEncoding=utf-8&useSSL=false
2 JdbuUtil
public class JdbcUtil {
//创建数据源
private static HikariDataSource dataSource;
static {
try {
//读取配置文件
InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(is);//加载配置文件
String driver = properties.getProperty("db.driver");
String url = properties.getProperty("db.url");
String user = properties.getProperty("db.user");
String password = properties.getProperty("db.password");
//配置数据源
dataSource = new HikariDataSource();
dataSource.setDriverClassName(driver);
dataSource.setJdbcUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取数据库的连接
*
* @return
*/
public Connection getConnection() {
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return conn;
}
九 、随机生成6位验证码
1 CodeUtil
public class CodeUtil {
public static String getCode() {//随机生成6位验证码
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder sb = new StringBuilder(6);
for (int i = 0; i < 6; i++) {
char ch = str.charAt(new Random().nextInt(str.length()));
sb.append(ch);
}
return sb.toString();
}
}
十 过滤器:
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">
<!--配置第一个过滤器-->
<filter>
<filter-name>firstTestFilter</filter-name>
<filter-class>com.hisoft.filter.FirstTestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>firstTestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--第二个过滤器-->
<filter>
<filter-name>secondTestFilter</filter-name>
<filter-class>com.hisoft.filter.SecondTestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>secondTestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
注:
filterChain.doFilter
将请求转发给过滤器链的下一个filter , 如果下面没有filter,那就是请求转发给你你请求的资源。
FirstTestFilter
package com.hisoft.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FirstTestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
request.setCharacterEncoding("UTF-8");
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requestURL = request.getRequestURI();//获取请求的uri(除去Http://localhost:8080)后的那一部分
System.out.println("请求的uri");
System.out.println("doFilter前: 我是第一个filter");
filterChain.doFilter(servletRequest,servletResponse);//放行
System.out.println("doFilter后: 我是第一个filter");
//注:filterChain.doFilter将请求转发给过滤器链的下一个filter , 如果下面没有filter,那就是请求转发给你你请求的资源。
}
@Override
public void destroy() {
}
}
SecondTestFilter
package com.hisoft.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SecondTestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化方法,可以在这设置一些初始化参数!");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
request.setCharacterEncoding("UTF-8");
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requestURI = request.getRequestURI();
System.out.println(requestURI);
System.out.println("前:第二个过滤器");
filterChain.doFilter(servletRequest,servletResponse);//调用doFilter放行
System.out.println("后:第二个过滤器");
//注:filterChain.doFilter将请求转发给过滤器链的下一个filter , 如果下面没有filter,那就是请求转发给你你请求的资源。
}
@Override
public void destroy() {
}
}
十一、excel导入导出 (springMvc框架实现)
导入:
需要依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
导出
@Controller
public class A {
@Autowired
private SiteService siteService;
@GetMapping("/tes")
public String find(HttpServletRequest request, HttpServletResponse response){
List<Site> siteList = siteService.findAllSite();
HSSFWorkbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("站点列表");//创建导出的表名
Row row = sheet.createRow(0);//创建一行
Cell c0 = row.createCell(0);//创建第一行第一列
c0.setCellValue("序号");//第一行第一列塞值
Cell c1 = row.createCell(1);//创建一行第二列
c1.setCellValue("ID");//创建一行第二列塞值
Cell c2 = row.createCell(2);
c2.setCellValue("站点名称");
Cell c3 = row.createCell(3);
c3.setCellValue("站点方向");
Cell c4 = row.createCell(4);
c4.setCellValue("站点类型");
for (int i = 0; i < siteList.size(); i++) {
Row r = sheet.createRow(i+1);
Cell cell0 = r.createCell(0);
cell0.setCellValue(i+1);
Cell cell1 = r.createCell(1);
cell1.setCellValue(siteList.get(i).getId());
Cell cell2 = r.createCell(2);
cell2.setCellValue(siteList.get(i).getSiteDirection());
Cell cell3 = r.createCell(3);
cell3.setCellValue(siteList.get(i).getSiteName());
Cell cell4 = r.createCell(4);
cell4.setCellValue(siteList.get(i).getSiteType());
}
response.setContentType("application/vnd.ms-excel");
OutputStream os = null;
try {
String name = new String("站点列表.xls".getBytes("UTF-8"),"Iso8859-1");//导出后表明可能会乱码,所以导出前进行硬编码
response.setHeader("Content-Disposition","attachment; filename=\" "+name+"\"");
os = response.getOutputStream();//获取到刷出流
workbook.write(os);//将创建好并填入数据的表通过流的形式写出去
} catch (IOException e) {
e.printStackTrace();
}
try {
os.close();
workbook.close();//记得关闭资源,否则第二次进来的时候
} catch (IOException e) {
e.printStackTrace();
}
return "site/a";
}
}