zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    第七章 内部类与异常类
    2019 Multi-University Training Contest 1
    2019 Multi-University Training Contest 4
    支配树总结
    2019牛客多校第四场题解
    2019牛客多校第三场题解
    莫比乌斯函数总结
    2019牛客多校训练第二场题解
    2019牛客多校训练第一场题解
    洛谷P3069 [USACO13JAN]牛的阵容Cow Lineup(尺取法)
  • 原文地址:https://www.cnblogs.com/demo-deng/p/8205835.html
Copyright © 2011-2022 走看看