工具 习题

一、JDBC MySQL

0User

	private int id;
    private String userName;
    private  int userAge;
    private String password;

1JdbcUtil

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;
    }

}

返回首页: 确定返回

2UserDaoImpl

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;
    }


}

3RowMapper:接口

返回首页: 确定返回

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;

}

返回首页: 确定返回

4BeanRowMapper:实现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;
    }
}

返回首页: 确定返回

5UserTest

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();
        }
    }

}
BUserShowServlet
@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();
    }
    
}
Cuser.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";
    }
}

下载网站

1 commons组件: https://commons.apache.org/

2 jar包下载网站mvnrepository : https://mvnrepository.com/

3 jcaptcha验证码: http://jcaptcha.sourceforge.net/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值