黑马旅游网站笔记【JavaWeb】

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

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

web层:前端

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

DAO层:mysql5+druid链接池+JdbcTemplatejava

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

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

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

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


对于post请求:ajax

  • request.setCharacterEncoding("utf-8")


对于get请求:redis

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

    <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"/>chrome

  • 程序进行处理,例如:

    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.im/post/5d6e6a…
  • 修改js后刷新浏览器无反应:浏览器缓存所至,可清空浏览器缓存。可手动关闭浏览器缓存功能。

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

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

相关文章
相关标签/搜索