JavaWeb

JavaWeb

前端部分

1、html是解释性语言,可以有错误

   java是编译性语言不能有错误

 

2、标签开始顺序和结束顺序必须要相同

 

3、以自己本身为基准,进行移动用margin

  以父类为基准,进行填充然后通过挤子类也可以将子类进行移动用padding

 

4、在IE浏览器中 实际的块尺寸为width

  在谷歌中 实际的块尺寸为width+左右border+padding

 

5、绝对定位:将整个页面看成是一个x轴和y轴

相对定位:相对于父类进行位置定位  父容器会根据子类的变大而变大

Servlet

1、静态资源:无需通过代码运行生成的资源,例:html css js img

     动态资源:需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时动态生成,例如:Servlet Thymeleaf

 

2、前端页面和后端服务器连起来的逻辑

 

3、http://localhost(找到服务器)//8080(找到tomcat)//demo02/s1

找到tomcat之后会向外暴露webapps,通过webapps定位到demo02项目,然后找到配置文件web.xml,然后找到s1对应的class,然后通过反射获得servlet的字节码文件,最后反射执行方法。

 

4、客户端向服务器发送html请求,服务器将会给客户端相应的信息,包括响应头和响应体。

响应体中是.html文件的内容,响应头ContentType里面的内容,通过conf/web.xml(记录了几乎所有文件类型的对应的MIME类型)查找html文件对应的类型并赋值给响应头。

http中请求头的Accept用来描述客户端希望接收到的响应数据类型,包括text/html、application/json等

如果访问servlet(不是静态资源,静态资源有.html等文件拓展名的),浏览器会默认将响应体里的内容看作html代码。

请求和响应对象是在服务器端产生的。

 

5、模糊匹配

在ul-pattern中配置访问servlet时的名称,如果用/ 除了jsp文件,输入其他任何名称都会访问到该servlet;如果用/* 则jsp文件也可以访问

*.action:前缀模糊匹配,后缀必须要为.action

/a/*:匹配前缀,前面必须为a

 

6、servlet的生命周期分为四个阶段,分别为实例化、初始化(前两个可以是服务器启动时就执行且只执行一次)、service、销毁,都是由tomcat自动执行。

  刷新servlet对应页面时实例化和初始化只有原先的一次,而每次刷新,service执行一次,关闭tomcat时销毁

 

7、servlet里的成员变量是线程共享的,不建议在service中修改成员变量,否则会出现线程安全问题,出现线程安全得用锁,而锁又会降低线程执行得效率。

 

8、当请求和所有servlet都没有匹配上,这时将会进入defaultServlet,然后通过Io流加载请求对应的文件,并返回response(包括content-type和content-head)给客户端。

 即defalutServlet加载所有的静态资源。

 

servlet继承结构

Servlet的继承关系  接口Servlet->抽象类GenericServlet->抽象类HttpServlet->自定义servlet

 

1、GenericServlet实现了Servlet中的抽象方法destroy,但方法体内没有任何内容,这样可以使得实现GenericServlet的类不用再抽象重写该方法。(重写:子类继承父类的方法,并将内容进行个性化;重载:一个类中方法名相同,但参数列表不同)

 

2、如果当前servlet没有重写doGet或者doPost,就会调用父类HttpServlet的doGet、doPost方法,然后报405

 

3、继承HttpServlet后,要么重写service,要么重写 doGet/goPost,如果两个都写了,那么执行service,service中又调用doGet和doPost方法

 

4、生成javaweb项目

project Structure->modules->添加对应项目的tomcat依赖

部署tomcat项目-》deployment-》改成对应的项目(项目名千万不能弄错)

项目部署后,tomcat启动servlet可以访问,但html文件对应页面一直显示404,因为文件放错位置!!必须放在webapp下,和web-inf同等级

 

ServletConfig和ServletContext

一个ServletConfig对象对应一个Servlet,而ServletContext对象为所有Servlet所共享。

 

1、URI 统一资源标识符  例如:/demo03 /a.html 

   URL统一资源定位符  例如:http://ip:端口号/demo03/a.html  资源标识符前面的内容可能会随着服务器的变化而变化

 

2、请求行: 方式 uri  http/1.1 get方式可以有请求体,只是在提交form表单时将请求体放到了uri的后面,而不往请求体中放,请求体为参数信息

 

请求转发

1、客户端并不知道服务器内部的请求转发功能,客户端的地址栏是不变的,服务器只产生了一对request和response对象,转发的对象可以是静态资源也可以是非静态资源

 

2、直接访问WEB-INF下的资源是访问不到的(受保护),但是请求转发可以,也是访问WEB-INF的唯一方式。

 

重定向

1、注释部分和最下面语句效果相同,表示为响应重定向, 设置响应状态码为302 同时设置响应头中的location字段值,该值表示重定向的目标名称

//        resp.setStatus(302);
//        resp.setHeader("location","servlet2");
        
        resp.sendRedirect("servlet2");

 如果两种方式都可以使用访问该资源,优先使用重定向进行页面跳转,不是页面跳转的话不一定

 

日志乱码问题

在config下的配置文件中,只有最后一行设置为UTF-8,其它上面三行设置为GBK,上面三行对应log,最下面一行对应server

 

get和post请求体乱码

在get方法中,键值对存在uri的后面 可以通过修改配置文件server.xml中的Connector来修改键值对中值的解码

在post方法中,参数键值对在请求体中,不能用上述方法,直接在servlet代码中进行设置

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        System.out.println(req.getParameter("username"));
    }
}

 

相对路径问题

当使用请求转发时,不能使用磁盘的目录结构来获得图片资源,因为资源最终路径=客户端(浏览器)发送的URI+获得的相对路径。不以/开头,返回上一级用../

不能只看目录结构,因为目录的加载是由客户端来决定的,而不是服务器⭐

 

绝对路径问题

绝对路径有一个统一的起点,在tomcat项目中测试为localhost:8080,则在文件中绝对路径从module开始,例:/demo05/static/img/logo.png

请求转发和重定向的相对路径和前端的相对路径相同,但是请求转发的绝对路径不需要加上下文,默认会添加,重定向的绝对路径是需要加上下文的。

上下文(dem05)可能会改变,解决方法如下:

方法1:在头部设置<base href="/demo5">,会在所有的相对路径前面加上该路径,减少了修改上下文,使得相对路径变成绝对路径

方法2:直接将上下文设置为/,此时绝对路径不用写上下文

 

MVC架构模式

尽量实现高内聚低耦合(修改代码时不影响其它部分)、开闭原则(开放拓展关闭修改)

 

简单的登录和注册项目(日程管理第二期)

1、dao中定义的接口,提供操作名的标准,只看接口定义了哪些方法,这样和服务层的service的耦合度低。

 

2、mysql中如果返回的是count()的结果,则类型默认为long

 

MVC

Session和Cookie

1、cookie是session的ID

 

2、设置了时效性的Cookie叫做持久化Cookie

 

3、账号、密码权限等比较敏感的信息使用Session存储,视频播放进度等信息只是用Cookie就可以。

 

4、一个用户访问服务器有一个Session,但同一个用户不同浏览器会产生不同的Session对象。

  Session对象默认时限为30分钟,如果在中间使用了该Session,则会从此刻开始可以再活30分钟

 

5、tomcat中的config文件夹下有一个web.xml,工程中也有一个web.xml,config文件夹下的web.xml为默认的配置,当两个有相斥时,会用工程下的web.xml中的配置。

 

6、关闭浏览器再打开,session会话域如果没到时间不会消除

 

域对象

1、会话域HttpSession可以跨多个请求,请求之间不需要有请求转发也可传递数据,但不同客户端之间拿不到

 

2、Cookie是在客户端保存数据的技术,Session是在服务器端保存数据的技术。

 

3、应用域servletContext 应用域在工程启动时就会创建对象,HttpSession需要在servlet中调req.getSeesion时才会产生,请求域HttpServletRequest在客户端请求时会产生。

过滤器

1、在请求到目标资源、目标资源响应到客户端之间都会经过过滤器,但是请求时,过滤器可以控制能不能继续往后走,响应时控制不了,只能对响应的内容进行设置。

 

2、filter顺序通过配置文件中的<filter-mapping>的顺序决定,谁在前面,先经过谁

  如果使用注解方式,通过在同一个包下的类名字典顺序,来确定执行顺序。

 

监听器

监听器用来监听域对象的状态,常用来监听ServletContext,ServletContextListener用来监听应用域的初始化和销毁状态,ServletContextAttributeListener用来查看应用域属性的更改。

 

Ajax

1、同步交互:客户端操作和服务器是交替的,客户端向服务器发出申请,必须要服务器响应之后客户端才会进行下一步操作,使用a、form标签

   异步交互:使用js代码发送请求,服务端开始处理请求,而客户端继续进行下一步操作,不需要等到服务端响应,根据服务端响应的内容进行判断,是否将内容返回到客户端,也可以使用XmlHttpRequest对象。

 

2、在响应体中放入信息:resp.getWriter().write("hello:"+username),其中resp.getWriter()是一个打印输出流

响应体中的Json

1、响应行中的状态码只有为200时,对应响应体中才会有code,其中值为1代表成功,2代表失败,因为响应成功!=业务成功

 

2、data用来装本次响应的数据,message对code进行补充说明。

 

3、流程规范

后端使用Result对象表示响应的结果,Result中code和message的对应关系需要用到枚举类进行构建,将后端的结果转换成JSON串响应给客户端,然后使用JSON.parse(JSON串)将串转成前端对象,通过码获得执行业务的结果。

为什么要这样?因为响应的结果中code和message是人为定义的,如果放在前端实现代码不够简洁,而后端使用枚举类型去定义的话更加简洁明了。

Maven

1、gav是创建时项目以及包的名字要求,p指packing即打包项目的类型,如果是pom表示为父工程,聚合用

 

2、pom.xml里依赖有个属性<scope>用来指定该依赖作用的范围,默认compile是包括main和test;runtime表示main不会,test不会只有打包和运行时使用(mysql  需要反射时注入驱动),provided main和test会用,打包和运行不用(servlet 因为tomcat也提供了servlet)

 

3、依赖冲突解决原则:引用路径长度谁短谁优先;当路径长度相等时,先声明的优先。

 当产生依赖冲突之后,后面的依赖传递全部终止,报错之后手动添加

 

4、构建命令周期:触发周期后的命令会自动触发同一周期前的命令!

   清理:clean ; 构建:compile test package install/deploy;报告: site

   使用可视化图的插件执行命令时,要手动按照顺序执行前面需要的执行的命令,并没有命令周期

 

posted @ 2024-12-16 10:58  Dyj07  阅读(19)  评论(0编辑  收藏  举报