黑马旅游网站笔记【JavaWeb】

1,777 阅读4分钟

最近跟着做了个黑马机构的javaweb旅游网站,在此记录下实现过程中的笔记:
项目视频链接:www.bilibili.com/video/av680…

整体技术选型:(mvc模式,但demo业务逻辑较简单,个人将业务层放在web层中了)

web层:

  • html+ajax:视图层
  • Servlet+Filter:前端控制器/过滤器
  • BeanUtils:实体数据封装
  • jackSon:json序列化工具
  • javaMail:邮件发送工具
  • redis+jedis:nosql型数据库

DAO层:mysql5+druid连接池+JdbcTemplate

问题一:maven乱码问题
整个项目基于maven构建:控制台乱码、后台接收中文参数乱码。网上的资料比较多,解决方式我都有所尝试,最后这样解决:

现在还有点疑惑为何将其设定为GB2312就可以?maven不是借助tomcat进行部署的吗,tomcat7及其以下它默认的编码是ISO8859-1。为何我设定的GBK或者UTF-8无效,只有GB2312解决了我的问题??

问题二:post/get请求乱码问题

  • 起因:使用ajax发送get请求时servlet接收带中文参数乱码了。解决办法如下:


对于post请求:

  • request.setCharacterEncoding("utf-8")


对于get请求:

  • 修改tomcat自身的配置文件:在conf/server.xml中将

    <Connector connectionTimeout="50000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    

    修改为 <Connector connectionTimeout="50000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

  • 程序进行处理,例如:

        String name = request.getParameter("name");
        name = new String(name.getBytes("iso-8859-1"),"utf-8");
    
    
  • 统一解决方式:使用Javaweb中的过滤器Filter,采用装饰者模式进行编码统一解决post/get请求乱码问题。

/**
 * 采用装饰者模式对request进行增强,解决全站乱码问题,处理所有post/get请求
 */
@WebFilter("/*")
public class CharacterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {
        //将父接口转为子接口
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) rep;
        MyRequest myRequest = new MyRequest(request);
        //处理响应乱码
        response.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(myRequest, response);//此处传入增强后的request对象
    }

    @Override
    public void destroy() {

    }

    /*
    对request对象进行增强
    重写getParameter与getParameterValues方法
     */
    class MyRequest extends HttpServletRequestWrapper {

        HttpServletRequest request = null;

        public MyRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }

        //增强getParameter方法
        @Override
        public String getParameter(String name) {

            String method = request.getMethod();
            String value = null;
            try {
                request.setCharacterEncoding("utf-8");
                value = request.getParameter(name);
                if ("get".equalsIgnoreCase(method)) {
                    value = new String(value.getBytes("iso-8859-1"), "utf-8");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return value;
        }

        //增强getParameterValues方法
        @Override
        public String[] getParameterValues(String name) {

            String method = request.getMethod();
            String[] values = null;
            try {
                request.setCharacterEncoding("utf-8");
                values = request.getParameterValues(name);
                if ("get".equalsIgnoreCase(method)) {
                    int i = 0;
                    for (String str : values) {
                        values[i++] = new String(str.getBytes("iso-8859-1"), "utf-8");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return values;
        }
    }

}


试着将注册页面的请求改为GET请求,执行完毕去数据库一看,纳尼,还是乱码???一顿debug发现没问题呀,获取到的是中文,后来发现用的获取数据是request.getParameterMap与BeanUtils进行封装的,我没增强getParameterMap方法。

问题三:html之间参数传递及其乱码问题
关于js的三种编码解码方式:www.haorooms.com/post/js_esc…

    //方式一:比如获取http://.....?rname=张三
    var search = location.search;
    var rname = search.split("=")[1]; // 切割字符串,拿到第二个值
   //方式二:
   var cid = getParameter("rname");
   function getParameter(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    var r = location.search.substr(1).match(reg);
    if (r != null) return (r[2]);
    return null;
    //解码
    if (rname!=null) {
        //url解码
        rname = window.decodeURIComponent(rname);
    }
 }

问题四:maven用tomcat7:run启动不起来:

  • 起因:之前点错了在原项目中新建了一个moudle,删除moudle后运行tomcat7:run启动不起来也不报任何错误信息,连target目录都未生成。
  • 原因:之前新建一个Moudle后系统自动将我的pom.xml进行了修改。[一个小时才找出来,新手上路....]
  • 解决办法: 将<packing>pom</packing>改成<packing>war</packing>即可
    <groupId>zcc</groupId>
    <artifactId>travel</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    

PS:打包类型有三种:jar、pom、war 如果是自己需要运行的项目则将其打包为war包即可。

问题五:浏览器缓存问题
时不时有遇到修改js界面的=没得反应,多次刷新也无果,crtl+shift+delete清空浏览器缓存即可.
chrome取消浏览器缓存:在调试面板选择network选择Disable cache即可.

js相关:

  • prop(),attr()设置对象属性:能用prop()就用prop() juejin.cn/post/684490…
  • 修改js后刷新浏览器无反应:浏览器缓存所至,可清空浏览器缓存。可手动关闭浏览器缓存功能。

  • location对象是window对象的一个部分,包含有关当前URL的信息
    location.href():设置或返回完整的url
    location.search():设置或返回从?开始的URL部分
    location.reload():刷新当前页面

小结:
由于跟老师做过一些开发,整体上来说后台功能实现起来并不难,并且感觉视频老师实现起来有那么些随意hhhhhh,前台界面平时写的太少,html+css+js学了忘,想自己调个啥样式必须得上网查。。。
视频老师开局就是干编码,直接导sql,导初始项目。自己整理了下需求提取出功能,在对他给的sql看了下,理解每个字段的含义,看是如何表设计的。
总体来说:学习了如何一个人从0到1开干做一个简单的小项目。