• 20180105随笔


    过滤器的执行过程:
    // 目标资源执行前执行
    chain.doFilter(request, response);
    // 目标资源执行后执行

    文件上传的前提:
    1.表单的method方法必须是post
    2.表单的enctype类型必须是:multipart/form-data
    3.表单中input的上传输入域为:<input type="file"/>
    <form method="post" enctype="multipart/form-data>
    name:<input type="text" name="name"/>
    file:<input type="file" name="upLoad"/>
    <input type="submit" value="up"/>
    </form>
    form表单的enctype属性,该属性的作用是用来告知服务器,请求正文内容是MIME类型,相当于Content-type
    利用第三方组件实施文件上传,apache:commons-fileupload.jar,依赖:commons-io.jar
    代码:
    // 检查form的enctype是否是multipart类型
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    if(!isMultipart)
    throw new RuntimeException("文件类型不符")
    // 解析请求内容,磁盘文件条目工厂
    DiskFileItemFactory factory = new DiskFileFactory();// 产生FileItem的工厂
    ServletFileUpload sfu = new ServletFileUpload(factory);
    // 建立一个数据结构,用于存储FileItem的数据
    List<FileItem> items = new ArrayList<FileItem>;
    try{
    // 对请求进行解析,吧解析的内容放入到items里面
    items = sfu.parseRequest(request);
    }catch(FileUploadException e){
    throw new RuntimeException("failed");
    }
    // 对items的数据进行遍历取出
    for(FileItem item:items){
    // 普通字段
    if(item.isFormField()){
    processFormField(item);
    }else{
    processUploadField(item);
    }
    }
    上传中考虑的几个问题
    1.将文件放到用户访问不到的地方(WEB-INF目录下)
    2.重复名字文件被覆盖的问题,把文件名做成唯一,UUID:通用唯一标识码。a.txt--->UUID-a.txt
    3.避免一个文件夹中的文件过多
    1)按照日期分目录存储
    2)按照文件名的hashCode随机生成目录
    int hashCode = fileName.hashCode();
    int dir1 = hashCode&0xf;
    4.文件大小的限制
    web文件上传的内容不宜过大,就是要对工厂的容量进行限制
    1)限制单个文件的大小
    sfu.setFileSizeMax(3*1024*1024);
    2)限制整个文件的大小
    sfu.setFileMax(5*1024*1024);
    try{
    items = sfu.parseRequest(request);
    }catch(FileUploadBase.FileSizeLimitExceededException e){
    response.getWriter().write("must small 3M");
    }catch(FileUploadBase.SizeLimitExceededException e){
    response.getWriter().write("sum must small 5M");
    }
    ServketContextListener
    ServletContextListener
    HttpSessionListener
    HttpSessionListener
    ServletRequestListener
    ServletRequestListener
    ServletContextAttributeListener
    ServletContextAttributeListener
    HttpSessionAttributeListener
    HttpSessionAttributeListener
    ServletRequestAttributeListener
    HttpSessionBindingListener
    HttpSessionActivationListener
    AJAX引擎:XMLHttpRequest
    JSON:js对象标记,js Object Notation

    List<String> list = new List<String>;
    list.add("a");
    list.add("b");
    list.add("c");
    JSONArray json = JSONArray.fromObject(list);

    public class CreateDeng{
    // 泛型使用之前必须声明
    // <T>就是声明泛型类型,放在返回值的前面
    public <T> T v1(){
    return null;
    }
    public <T> void m2(T t){
    }
    public <T> void m3(class<T> t){
    }
    }
    // 类上声明泛型,实例方法中就可以使用了
    public class CreateDeng<T>{
    public T m1(){
    return null;
    }
    public void m2(T t){
    }
    public void m3(class<T> t){
    }
    // 对于静态方法必须都是先声明后使用
    public static <T> void m4(class<T> t){
    }
    public static <K,V> K m5(V v){}
    }
    低点:1302.2
    高点:1310.1
    点差:7.9
    7.9×0.382=3.0178---->1310.1-3.01=1307.09
    7.9×0.5=3.95---->1310.1-3.95=1306.15
    hibernate.cf.xml
    <hibernate-configuration>
    <session-factory>
    <!--JDBC基本链接-->
    <properties name="hibernate.connection.driver_class>com.mysql.jdbc.Driver</properties>
    <properties name="connection.username">root</properties>
    <properties name="connection.password">sorry</properties>
    <properties name="connection.url">jdbc:mysql:localhost:3306/day22</properties>
    <!--配置数据库方言-->
    <properties name="dialect">com.hibernate.dialect.MySQLDialect</properties>
    <properties name="hibernate.hbm2ddl.auto">update</properties>
    <!--显示sql的语句及格式>
    <properties name="hibernate.show_sql">true</properties>
    <properties name="hibernate.format_sql">true</properties>
    <!--告知映射文件>
    <mapping resource="../Student.hbm.xml"/>

    </session-factory>
    </hibernate-configuration>
    I not know how to get the money
    200dao*4=800kuajin
    Student.hbm.xml
    <hibernate-mapping>
    <class name="Student" table="STUDENTS">
    <id name="id" column="ID">
    <!--根据数据库的能力管理主健-->
    <generate class="native"></generate>
    </id>
    <properties name="name" column="NAME"></properties>
    <properties name="birthday" column="BIRTHDAY"></properties>
    </class>
    </hibernate-mapping>
    制定自己的三年规划:
    2018年,存款10W+;2019年,买一套房,付首付;2020年,买一辆自己的爱车奥迪A4L。无论想什么办法都要实现!!!
    Dao.java
    public Dao<T>{
    void add(T t);
    void update(T t);
    // 根据主健查找对象
    T findOne();
    // 根据主健删除对象
    void delete(Serializable id)
    }
    CustomerDao.java
    public interface CustomerDao extends Dao<Customer>{
    List<Customer> findPageCustomer(int startIndex, int size);
    }
    config.properties文件用来当作配置文件,通常为用于提供系统参数配置,方便用户对系统参数进行调整,通常以键值对的形式存在
    maven 软件项目管理工具
    xxx.hbm.xml类实体映射文件:
    hibernate.cfg.xml 核心配置文件:数据库配置信息
    这个其实也没有什么意思,这个算是一种约定
    就像我们中国人的名字都是第一个字是姓,后面的是名一样
    我们用这样的命名一眼就可以看出来是hibernate的映射配置文件,
    当然如果我们其他的xml配置文件也用这样的格式命名也是可以的,但是这样相当于一种约定,一种命名规范一样
    uuid通用唯一识别码:在xxx.hbm.xml文件中,用于配置主健
    java 中@的使用
    1.javadoc 文档关键字
    /*
    *@author
    *@date
    */
    自动生成API文档,标注作者,版本,日期,相关参数等
    2.java annotation /java 标注
    语法:@关键字(值)
    用于把关键字和值传递给编译器,更加精确地控制编译器的动作
    关键字随着技术、框架、编译器的不同而不同,比如@Override,说明会重写父类的该方法
    @Deprecated 表示当前元素是不赞成使用的
    @SuppressWarning 表示忽略一些不当的编译器信息
    src/main/java:存放java文件
    src/main/resource:存放配置文件
    src/test/java:存放测试的java文件
    src/test/resource:存放测试的资源文件
    src/main/webapp:存放jsp,images,js等文件
    src/main/webapp:存放jsp,images,js等文件
    FCK文本编辑框,js进度条,js文本框,js使用highslideJs
    // 使用InputStream输入流读取到path下的文件,将输入流InputStream写到输出流(response对象中获取)中
    InputStream in = new InputStream(new File(ServletActionContext.getServletContext.getRealPath(""), path));
    OutputStream out = response.getOutputStream();
    while(int b=-1;(b=in.read())!=-1){
    out.write(b);
    }
    out.close();
    in.close();
    //${}:EL表达式表示你从另外一个页面获得的参数值
    style="CURSOR:hand"// 当鼠标悬浮在标签上表现为手形
    timestamp:时间戳,是一个数据,一个能够表示在某个时间之前已经存在的、完整的、可验证的数据,通常是一个字符序列,
    唯一表示某一时刻的时间。
    "${pageContext.request.contextPath}/image.jsp?timestamp="+new Date().getTime()
    timestamp表示一个参数,一个叫时间戳,浏览器会判断当前请求路径是否发生改变,如果没有改变,它会提取缓存中的数据,
    而不是重新去请求。加上时间戳,保证每次请求的路径不一样。
    function checkNumberImage(){
    // 获取标签
    var imageNumber = document.getElementById("imageNumber");
    imageNumber.src = "${pageContext.request.contextPath}/image.jsp?timestamp="+new Date().getTime();
    }
    Random rand = new Random();
    String sRand = "";
    for(int i=0;i<4;i++){
    String rand = String.valueOf(rand.nextInt(10));
    sRand += rand;
    }
    session.setAttribute("CHECK_NUMBER_KEY",sRand);
    //ImageIO:用来进行简单的图片IO操作,一个是读(read),另一个是写(write)
    1.read:
    File file = new File("c:/test/a.jpg");
    BufferedImage bi = ImageIO(file);
    2.write:
    RenderedImage的子类是BufferedImage,传递子类直接实例化父类
    public static boolean write(RenderedImage im, String formatName, File output);
    public static boolean write(RenderedImage im, String formatName, OutputStream output);
    public static boolean write(RenderedImage im, String formatName, BufferedOutputStream output);
    // public static boolean isBlank(String str):是否为空(null),长度为0,由空白字符(whitespace)等组成
    StringUtils.isBlank(null)=true;
    StringUtils.isBlank("")=true;
    StringUtils.isBlank(" ")=true;
    // public static boolean isEmpty(String str):判断为空,标准是String str=null或者String str.length()==0
    StringUtils.isEmpty(null)=true;
    StringUtils.isEmpty("")=true;
    StringUtils.isEmpty(" ")=false;
    equalsIgnoreCase
    public boolean equalsIgnoreCase(String anotherString)
    将此字符和另一个字符忽略大小写后进行比较,返回布尔值
    // 从网页获取数值
    request.getParameter(xxx)
    // 从session获取数值
    request.getSession().getAttribute(xxx);
    public class loginUtil{
    // remember me
    public static void rememberMe(String name, String password, HttpServletRequest request, HttpServletResponse response){
    // 建立两个Cookie,存放指定值
    Cookie nameCookie = new Cookie("name",name);
    Cookie passwordCookie = new Cookie("password", password);
    // 设置Cookie的有效路径(当前项目)
    nameCookie.setPath(request.getContextPath()+"/");
    passwordCookie.setPath(request.getContextPath()+"/");
    // 设置cookie的生存时间
    // 先获取页面用户选定记住我的复选框的值
    String rememberMe = request.getParameter("remember");
    // 复选框选定
    if(remember!=null && remember.equals("yes")){
    // 生存时间为7天
    nameCookie.setMaxAge(7*24*60*60);
    passwordCookie.setMaxAge(7*24*60*60);

    }
    // 复选框没有选定
    else{
    nameCookie.setMaxAge(0);
    passwordCookie.setMaxAge(0);
    }
    // 将Cookie添加到response中
    response.addCookie(nameCookie);
    response.addCookie(passwordCookie);

    }
    }
    // 在页面中读取cookie数据,嵌套java代码
    <%
    String name = ""'
    String password = "";
    String checked = "";
    // 获取请求的cookie
    Cookie[] cookies = request.getCookies();
    if(cookies!=null && cookies.length()>0){
    // 遍历数据,获取想要的cookie
    for(Cookie cookie:cookies){
    if(cookie.getName().equals("name")){
    name = cookie.getValue();
    checked = "checked"
    }
    if(cookie.getName().equals("password"){
    password = cookie.getValue();
    }
    }
    }
    %>
    // 要知道,每次访问URL链接的时候,先执行过滤器的doFilter方法
    // this永远表示当前对象,在jsp中,this就是指9大内置对象的page,Object page = this
    request.setAttribute("name",name)
    URLEncoder.encode(name,"utf-8");
    URLDecoder.encode(name,"utf-8");
    URLDecoder:HTML编码的实用工具类

    // 在域对象内,进行存值和取值
    在action中将数据放到值栈中,然后在页面中从值栈中取值
    每次访问action就创建一次值栈,一个action只有一个值栈
    栈结构:root对象栈,context叫做Map栈,放入元素,压栈
    值栈分为两个部分,root部分和context部分
    ValueStack s = ActionContext.getContext().getValueStack();
    s.set("username","fireman");
    // 访问控制系统必须要存在session,这样可以记录用户信息,服务器获取用户登录后的session,如果为空,则跳转到登录页面
    如果session不为空,直接方形
    // 如果在action,service,dao中出现异常,使用catch进行异常捕捉,使用log4j将异常存放到指定的日志文件中,通过return "errorMsg"
    跳转到错误页面

    // 粗粒度的权限控制,采用过滤器,精确到session的控制权限,判断session是否存在。如果session不存在就跳转到首页,如果存在可以通过URL链接访问对应的操作
    // 细粒度的权限控制,采用struts2的拦截器,控制URL,可以访问相关的jsp页面,不可以访问一个jsp页面
    webservice:用来在多个独立系统之间,建立一个桥梁
    hibernate的二级缓存机制(cache):对应查询结果相同的数据,可以减少频繁操作数据库的操作
    sessionFactory:二级缓存:1)类级别缓存;2)集合级别缓存;3)查询级别缓存;4)更新时间戳缓存
    SQL的联合查询语句,field理解为字段更为合适
    lucene工作原理:
    1)索引数据库原理:
    向索引库中进行增、删、改的时候:IndexWriter:addDocument(),updateDocument(),deleteDocument()-->创建索引库:一堆二进制文件;
    indexSearcher:从索引中检索数据searcher()
    Document对象
    new Field("id");
    new Field("name");
    new Field("content");
    Article对象
    id,name,content
    索引库中存放数据的原理
    Store:是否将数据存储到索引库的数据区域
    Index:是否将数据更新到索引库的目录区域
    使用唯一编号来区分数据的唯一性
    数据库用来存放数据
    索引库用来查询和检索
    <properties>
    <!--配置扩展-->
    <common>IK_Analyzer</common>
    <entry key="ext_dic">ext.dic</entry>
    <entry key="ext_stopwords>stopword.dic</entry>
    </properties>
    set和get方法可以提高与变量的安全性和封装性。变量赋值:1)在构造函数内部;2)采用set方法
    一般对私有变量进行访问操作,大多数都是使用在包含大多数属性的类实体中
    <script language="javascript" src="${pageContext.request.contextPath}/script/xxx.js"></script>
    new SimpleDataFormat
    Content-Disposition:MIME类型指定代理如何显示附加文件。服务器向浏览器发送文件时,如果用户需要保存,
    可以使用该设置进行文件保存,但是必须要附加上:attachment;filename="xxx";
    也就是确保浏览器弹出下载对话框
    response.setHeader("Content-Disposition", "attachment;filename="+fileName);
    JXL是java操作excel的工具类库,从文件中获取excel数据,读取数据后,将数据写入到集合中
    用户通过模板导入数据,之后再从模板中读取数据,将数据保存到数据库中,excel导入数据
    防止表单重复提交:生成一个token,放到:HttpSession;input隐藏域
    表单提交:input=111,之后从HttpSession获取,input隐藏域。
    进行对比,一值:保存数据,将HttpSession的数据删除;不一致,重复提交
    webapps:web应用所在的目录,供外界访问的web资源的存放目录。在该目录下,有几个文件夹就有几个目录
    WEB-INF:用户无法直接访问。classes:存放编译好的字节码文件;lib:存放应用需要的jar包;web.xml配置部署信息
    在Tomcat中的lib中的jar包,为所有应用需要的jar包,为所有应用服务
    Tomcat中的配置信息:
    <Server>:server容器组件,为顶级元素,可以包含一个或者多个<service>元素
    <service>:包含一个<engine>,一个或多个<connector>
    <connector>:代表实际与用户交互的组件,接受请求,返回相应
    <engine>:每个service只有一个engine引擎,处理客户的请求
    <host>:一个engine有多个host,具有多个应用
    <context>:使用最频繁的元素,代表一个应用
    用户的访问都是通过Tomcat的链接过来的,一个引擎中管理多个主机,一个主机有管理多个应用
    配置虚拟主机,在网站需要发布的时候,要对Tomcat服务器进行域名和主机配置,重要目录为:Tomcat/conf/server.xml
    在<engine>标签中配置:
    <Host name="www.deng.com" appBase="e:/appExample"
    unpackWARs="true" autoDeploy="true"/>
    修改本地hosts文件:C:/Windows/System32/drivers/etc/hosts
    name1=value1&name2=value2
    只有通过POST提交的方式才能够看到请求正文,正文的内容是要提交的数据
    name=username&password=mypassword&sex=male
    请求头的作用是向服务器传递一些附加信息
    Accept:告诉服务器,浏览器能够接受的MIME类型
    在磁盘中,通过文件名的后缀区分文件类型
    在网络中,通过MIME来区分数据
    MIME特点:大类型/小类型,text/plain
    1,2,3,4,5
    4:访问的资源不存在
    5:服务器内部错误,服务程序出现异常
    浏览器收到服务器的相应,数据都是HTML文件,浏览器对HTML文件进行展现
    servlet是运行在服务器端的动态资源,能够接受用户请求,发出相应
    服务器端的编程都是基于http协议的
    建立一个servlet,继承一个javax.servlet.http.HttpServlet抽象类
    javax.servlet:通用包
    javax.servlet.http:与http协议有关
    load-on-startup:一启动就加载
    Servlet关联:ServletConfig关联:ServletContext
    Servlet依赖:ServletRequest,ServletResponse
    GenericServlet实现Servlet
    HttpServlet继承GenericServlet
    HttpServlet依赖HttpServletRequest和HttpServletResponse
    在配置servlet时候可以配置参数
    <servlet>
    <servlet-name>Demo1</servlet-name>
    <servlet-class>com.deng.Demo1</servlet-class>
    <init-param>
    <param-name>sex</param-name>
    <param-value>male</param-value>
    </init-param>
    </servlet>
    //获取
    ServletConfig cfg = getServletConfig();
    cfg.getInitParameter("sex")
    //获取多个值
    ServletConfig cfg = getServletConfig();
    Enumeration e = cfg.getInitParameterNames();
    while(e.hasMoreElements())
    {
    String value = e.nextElement();
    cfg.getInitParameter(value);
    }
    ServletContext非常重要,每一个应用有一个ServletContext,和应用的生命周期完全一致
    实现多个Servlet之间的数据共享,ServletContext里面有一个map结构:key:"P",value:"p1"
    Servlet1:ServletContext.setAttribute("P","p1");
    Servlet2:ServletContext.getAttribute("P");
    ...
    域表示的是存活范围
    向ServletContext存放东西:public void setAttribute(String a, Object obj)
    从ServletContext去东西:public Object getAttribute(String a)
    从ServletContext删除东西:public void removeAttribute(String a)
    获取所有的名称:Enumeration getAttributeNames();
  • 相关阅读:
    【今日CV 视觉论文速览】 19 Nov 2018
    【numpy求和】numpy.sum()求和
    【今日CV 视觉论文速览】16 Nov 2018
    【今日CV 视觉论文速览】15 Nov 2018
    poj 2454 Jersey Politics 随机化
    poj 3318 Matrix Multiplication 随机化算法
    hdu 3400 Line belt 三分法
    poj 3301 Texas Trip 三分法
    poj 2976 Dropping tests 0/1分数规划
    poj 3440 Coin Toss 概率问题
  • 原文地址:https://www.cnblogs.com/demo-deng/p/8205835.html
Copyright © 2020-2023  润新知