javaEE

javaEE

javaEE_第1张图片

一、HTTP协议

1、请求头

  • Accept:用于告诉服务器,客户机支持的数据类型。
  • Accept-Charset:用于告诉服务器,客户机采用的编码。
  • Accept-Encoding:用于告诉服务器,客户机支持哪些压缩模式压缩后的数据。
  • Accept-Language:客户机的语言环境。
  • Host:客户机通过这个头告诉服务器,想访问的主机名。
  • If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。
  • Referer:客户机通过这个头告诉服务器,他是从哪个资源来访问服务器的(防盗链)

2、响应头

  • Location:配合302状态码使用,用于告诉客户端找哪个文件。
  • Server:服务器通过这个头,告诉浏览器服务器的类型。
  • Content-Encoding:数据的压缩格式。
  • Content-Length:回送数据的长度。
  • Content-Type:会送数据的类型。
  • Last-Modified:服务器通过这个头告诉浏览器当前资源的缓存时间。
  • Refresh:服务器通过这个头,告诉浏览器隔多少时间刷新一次。
  • Content-Disposition:告诉浏览器以下载的方式打开数据。
  • Transfer-Encoding:告诉浏览器数据的传送格式。
  • ETage:缓存相关的头。
  • Expires:回送的资源缓存多长时间,-1或0,则是不缓存。
  • Cache-Control:no-cache Pragma:no-cache 控制浏览器不要缓存数据

3、头字段使用

1)使用location和302实现请求重定向

response.setStatus(302);
response.setHeader("location","/day/1.html");

2)数据压缩

String data="asdasdasdadasdasdasdasasasasasasa";
ByteArrayOutputStream bout=new ByteArrayOutputStream();
GZIPOutputStream gout=new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
byte gzip[]=bout.toByteArray();//得到压缩后的数据
//通知浏览器数据采用压缩格式
response.setHeader("Content-Encoding","gzip");
response.setHeader("Content-Length",gzip.length+"");
response.getOutputStream().write(gzip);

3)控制浏览器打开数据的方式

response.setHeader("content-type","image/jpeg");//可参看web.xml
InputStream in=this.getServletContext().getSourceAsStream("/1.jpg");
int len=0;
byte buffer[]=new byte[1024];
OutputStream out=response.getOutputStream();
while((len=in.read(buffer))>0){
    out.write(buffer,0,len);
}

4)控制定时刷新,并可以选择跳到哪个页面

response.setHeader("refresh","3;url='http://www.sina.com'");

4、状态行

1)状态行

格式:HTTP版本号 状态码 原因叙述
举例:HTTP/1.1 200 OK

2)状态码

用于表示服务器对请求的处理结果,它是一个三位的十进制数,响应状态码分为5类,如下所示:

状态码 含义
100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200~299 表示成功接收请求并完成整个处理过程,常用200
300~399 为完成请求,客户需要进一步细化请求,例如,请求的资源已经移动到一个新地址,常用302、307
400~499 客户端的请求有误,常用404
500~599 服务器端出现请求,常用500

5、http请求

何为一次http请求?

  • 只要没有停止,同时也没有回到浏览器重定向,就算一次。
  • 如果转向多次,我们的浏览器地址栏,保留的是第一次转向的那个servlet URL

二、Servlet

1、生命周期

过程:Servlet调用init()方法进行初始化,调用service()方法来处理客户端的请求,调用destroy()方法终止,最后Servlet由JVM的垃圾回收器进行垃圾回收。
Servlet配置

<servlet>
    <servlet-name>TestServletservlet-name>
    <servlet-class>com.wenxue.servlet.TestServletservlet-class>
servlet>
<servlet-mapping>
    <servlet-name>TestServlet<servlet-name>
    <url-pattern>/TestServleturl-pattern>
servlet-mapping>

Servlet文件

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class TestWorld extends HttpServlet {

    private String message;

    public void init() throws ServletException
    {
        // 执行必需的初始化
        message = "Hello World";
    }

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
        // 设置响应内容类型
        response.setContentType("text/html");
        // 实际的逻辑是在这里
        PrintWriter out = response.getWriter();
        out.println("

" + message + "

"
); } public void destroy(){ // 什么也不做 } }

1)init()方法

init()方法在第一次创建Servlet时被调用,并且只被调用一次,用于初始化。

2)service()方法

每次服务器收到一个Servlet请求时,服务器会产生一个新的线程并调用服务,service()方法会检查HTTP请求类型(GET、POST、PUT、DELETE),并在适当的时候调用doGet、doPost、doPut、doDelete等方法。所以不用对service方法进行任何操作,只需重写doGet或doPost方法即可。

3)destroy()方法

destroy()方法在Servlet生命周期结束时被调用,并且只被调用一次,可以用来关闭数据库连接、停止后台进程、把Cookie列表或点击计数器写入到磁盘,并执行其它类似的清理活动。在调用destroy()方法后,servlet对象被标记为垃圾回收。

2、会话

基本概念:指用户开一个网站,访问一个网站,只要不关闭浏览器,不管用户点击多少超链接,访问多少资源,直到用户关闭浏览器,整个过程我们称为一次会话。

1)cookie

a、创建cookie
Cookie cookie=new Cookie("name","wenxue");
//设置cookie的生命周期
cookie.setMaxAge(3600);
//把cookie信息回写给浏览器
response.addCookie(cookie);
b、读取cookie
//读取所有的cookie信息,再选中你要的cookie
Cookie cookies[]=request.getCookies();
cookies[i].getName();
cookies[i].getValue();
c、小结
  • cookie是在服务器端创建。
  • cookie是保存在浏览器这端。
  • cookie的生命周期可以通过cookie.setMaxAge(2000);如果不设置setMaxAge则该cookie的生命周期是当浏览器关闭时,就消亡。
  • cookie可以被多个浏览器共享。
  • 怎么理解?

我们可以把cookie想象成一张表,名字 值对应。

  • 如果重名就会替换存在的cookie值
  • 一个web应用可以保存多个cookie
  • cookie存放的时候以明文方式存放,因此安全性较低,我们可以通过加密后保存。
  • cookie存放中文:
//存放:
String val=java.net.URLEncoder.encode("文学","utf-8");
Cookie cookie=new Cookie("name",val);

//取出:
String val=java.net.URLDecoder.decode(cookie.getValue(),"utf-8");

2) session

a、session介绍
  • session是放在服务器内存中。
  • 一个用户浏览器独享session域对象。
  • 生命周期,默认30min,可以通过web.xml修改。
  • 访问session,当发现没有session时就会自动创建session。
  • 如果同一个浏览器,向session设置一个属性时,如果名字重复,则会替换该属性。
b、session发呆时间

session周期是发呆时间,如果我们设置session是10s,是指在10s内,没有访问过session,session中的属性失效,如果在9s时,访问session,则重新计时。cookie的生命周期是指累计时间,不管用户是否访问过该cookie,cookie都会消失。

  • 如果重启tomcat,或者reload web应用,或者关机了,session会失效。
  • 我们也可以通过函数,让session失效。

invalidate()<=>该方法是让session中所有属性失效,通常用于安全退出。

  • 如果你希望某个session属性失效,可以使用方法removeAttribute(String name);
c、使用

关掉IE,再打开,上次购买的商品还在,涉及到session的销毁时间。
分析: 我们的session生命周期如果是30min,该session不会随浏览器的关闭而自动销毁,而是会到30min后,才才会被服务器销毁。我们可以使用代码实现该功能:

Cookie cookie=new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60*30);
response.addCookie(cookie);

3)cookie与session比较

a、存在的位置
  • cookie存在客户端的临时文件夹
  • session:存在服务器的内存中,一个session域对象为一个用户浏览器服务。
b、安全性
  • cookie是以明文方式存放在客户端的,安全弱,可以通过md5加密再存放。
  • session是存放在服务器内存中,所以安全性好。
c、网络传输量
  • cookie会传递信息给服务器。
  • session的属性值不会给客户端。
d、生命周期
  • cookie的生命周期:是累计时间,即如果我们给cookie设置setMaxAge(30)30s后失效。
  • session的生命周期是间隔的,从创建时,开始计时,如我们设置session20min,指在20min内,如果没有访问session,则session失效(含义是指无法取出session属性),在以下情况下session也会失效。

关闭tomcat、reload web应用、时间到、invalidate也会让session失效

e、使用原则

因为session会占用服务器的内存,因此不要向session存放过多,过大的对象,会影响性能。

4)ServletContext

a、ServletContext的特点
  • ServletContext是在服务器
  • ServletContext是被所有的客户端共享
  • ServletContext是当web应用启动时,自动创建。
  • ServletContext是web应用关闭/tomcat关闭/对web应用reload会造成ServletContext销毁。
b、获取ServletContext对象应用
  • 通过this直接获取
ServletContext servletContext=this.getServletContext();
  • ServletConfig获取
ServletContext servletConfig=this.getServletConfig().getServletContext();
c、使用
ServletContext.setAttribute(name,value);
servletContext.getAttribute(name);

如果希望所有的servlet都可以访问配置

<context-param>
    <param-name>nameparam-name>
    <param-value>scottparam-value>
context-param>

访问

String val=this.getServletContext().getInitParameter("name");
//读取资源文件,先创建db.properties文件 name=123 value=123
InputStream is=getServletContext().getResourceStream("db.properties");
Properties pp=new Properties();
pp.load(is);
pp.getProperty("name");

//如果文件放在src目录下,我们应该使用类加载器来读取
is=Servlet.class.getClassLoader().getResourceAsStream("db.properties");
//获取文件全路径
String path=this.getServletContext().getRealPath("/img/sun.jpg");

3、跳转

1)跳转方式

  • forward:是服务器内部跳转,可以使用request进行传值。
request.getRequestDispatcher("/servlet").forward(request,response);
  • sendRedirect:是服务器发送消息到浏览器,让浏览器重新发起请求,属于浏览器端跳转,可以链接外部网站。
response.sendRedirect("login.jsp");

2)比较

  • forward是转向,sendRedirect是重定向
  • forward发生在服务器端,sendRedirect发生在浏览器
  • forward带web名,sendRedirect不带web名
  • 能够去URL的范围不一样,forward只能去当前web应用,sendRedirect可以去任何URL

3)转发时序图

javaEE_第2张图片

4、过滤器

Servlet过滤器用来动态的拦截请求和响应,以变换或使用包含在请求或响应中的信息。
在web.xml文件中进行配置

<filter>
    <filter-name>LogFilterfilter-name>
    <filter-class>com.wenxue.filter.LogFilterfilter-class>
    <init-param>
        <param-name>Siteparam-name>
        <param-value>菜鸟教程param-value>
    init-param>
filter>
<filter-mapping>
    <filter-name>LogFilterfilter-name>
    <url-pattern>/*url-pattern>
filter-mapping>

过滤器操作

import javax.servlet.*;
import java.util.*;

//实现 Filter 类
public class LogFilter implements Filter  {
    public void  init(FilterConfig config) throws ServletException {
        // 用来获取web.xml配置文件中的初始化参数
        String site = config.getInitParameter("Site"); 
        // 输出初始化参数
        System.out.println("网站名称: " + site); 
    }
    public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
        // 把请求传回过滤链
        chain.doFilter(request,response);
    }
    public void destroy( ){
        /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
    }
}

5、乱码处理

1)post

request.setCharacterEncoding("utf-8");

2)get

//写一个工具类,将字符串转码
public static String getNewString(String str){
    String newString="";
    try{
        newString=new String(str.getBytes("iso-8859-1"),"utf-8");
    }catch(Exception e){
        e.printStackTrace();
    }
    return newString;
}

3)超链接a,同get

4)sendRedirect()发生乱码,同get

response.sendRedirect("servlet地址?username=文学");

补充:当下载文件时,可能提示框是中文乱码

String temp=java.net.URLEncoder.encode("传奇.mp4","utf-8");
response.setHeader("Content-Disposition","attachment;filename="+temp);

存储到数据库的数据也有可能乱码,在连接字符串中设置编码即可。

三、jsp

1、基础语法

介绍:jsp文件被第一次访问时,web服务器会将其翻译成一个servlet,然后将其编译成一个class文件,再将其加载到内存,如果是第二次或者以后,就直接访问内存中的实例,因此jsp也是单例,所以第一次访问jsp文件网站速度会比较慢,如果某个jsp文件被修改了,就相当于重新访问jsp文件,即相当于第一次。

1)指令元素

用于从jsp发送一个信息到容器,比如设置全局变量,文字编码,引入包等。

  • page指令
<%@page contentType="text/html;charset=utf-8"%> 

page常用属性:contentType和pageEncoding区别?
前者指定网页以什么方式显示,后者指定servlet引擎怎么翻译jsp->servlet,并制定网页以什么方式显示页面。

  • include指令
<%@include file="文件路径"%>

该指令用于静态导入一个文件到本页面。

2)脚本元素

java片段

<% java代码 %>
<%=1+2 %>//中间写表达式
<% int i=3 %>//该jsp对应的servlet的成员变量

3)动作元素

  • jsp
<jsp:forward page="/manage.jsp"/>

在开发jsp的过程中,我们通常把jsp页面放入WEB-INF目录,目的是为了防止用户直接访问jsp页面,在WEB-ROOT下我们有一个入口页面,它的目的主要是转发。

include file=""/>//动态引入文件
  • 引入文件
    <%@include file="文件路径"%>比较?
    相同点:把一个文件引入到另外一个文件中。
    不同点:

  • 静态引入:把两个jsp翻译成一个servlet,所以被引入的文件不要包括

  • 动态引入:把两个jsp分别翻译,所以被引入的jsp包括有也可以,最好不包括。

2、内置对象

  • out:用于向客户端输出数据,字节流。
  • request:就受客户端的http请求<=>servlet中的HttpServletRequest。
getParameter(String name);//name表示表单的参数名
getParameterValues(String name);//使用得到的是String[]
setAttribute(String name,Object obj);//设置名字为name的obj,值是obj
getAttribute(String name);//返回由name指定的属性值,如果不存在就返回null
getCookie();
  • response:封装jsp产生的回应<=>HttpServletResponse
addCookie(Cookie cookie);
sendRedirect("welcome.jsp");//重定向
  • session:用于保存用户的信息,跟踪用户的行为<=>servlet中的HttpSession
setAttribute(String name,Object obj);
getAttribute(String name);
  • application:多个用户共享该对象,可以做计数器<=>servlet的ServletContext
  • pageContext:代表jsp页面的上下文,也是一个域对象,可以setAttribute(),作用范围只是本页面。
  • exception:代表运行时的一个异常。
  • page:代表jsp这个实例本身(使用比较少)。
  • config:代表jsp对应的servlet的配置,可以得到web.xml中的参数<=>ServletConfig。

3、jstl标签

1)if标签

if test="${salary > 2000}">
    "${salary}"/>
if>

2)foreach标签

a、语法定义
forEach var="name" items="expression" varStatus="name" begin="expression" end="expression" step="expression">
body content... 
forEach>
b、属性

var:迭代参数的名称。在迭代体中可以使用的变量的名称,用来表示每一个迭代变量。类型为String。
items:要进行迭代的集合。对于它所支持的类型将在下面进行讲解。
varStatus:迭代变量的名称,用来表示迭代的状态,可以访问到迭代自身的信息。
begin:如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。
end:如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。它的类型也为整数。
step:迭代的步长。

c、迭代元素

标签的items属性支持Java平台所提供的所有标准集合类型。此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。它所支持的集合类型以及迭代的元素如下所示:

  • java.util.Collection:调用iterator()来获得的元素。
  • java.util.Map:通过java.util.Map.Entry所获得的实例。
  • java.util.Iterator:迭代器元素。
  • java.util.Enumeration:枚举元素。
  • Object实例数组:数组元素。
  • 基本类型值数组:经过包装的数组元素。
  • 用逗号定界的String:分割后的子字符串。
  • javax.servlet.jsp.jstl.sql.Result:SQL查询所获得的行。
d、status

不论是对整数还是对集合进行迭代,的varStatus属性所起的作用相同。和var属性一样,varStatus用于创建限定了作用域的变量(改变量只在当前标签体内起作用)。不过,由varStatus属性命名的变量并不存储当前索引值或当前元素,而是赋予javax.servlet.jsp.jstl.core.LoopTagStatus类的实例。该类包含了一系列的特性,它们描述了迭代的当前状态,如下这些属性的含义如下所示:

  • current:当前这次迭代的(集合中的)项。
  • index:当前这次迭代从0开始的迭代索引。
  • count:当前这次迭代从1开始的迭代计数。
  • first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。
  • last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。
  • begin:begin属性的值。
  • end:end属性的值
  • step:step属性的值
e、实例

表格隔行背景色变化

forEach var="item" items="${contents}" varStatus="status">
    if test="${status.count%2==0}">bgcolor="#CCCCFE"if> align="left">xxx
forEach>

4、el表达式

el表达式会依次从Page、Request、Session、Application域中取出数据。

${usernmaea}

5、错误页面

1)在web.xml页面配置


<error-page>
    <error-code>404error-code>
    <location>/WEB-INF/error.jsplocation>
error-page>

<error-page>
    <error-code>500error-code>
    <location>/WEB-INF/error.jsplocation>
error-page>

<error-page>
   <exception-type>java.lang.Exceptionexception-type>
   <location>/WEB-INF/error.jsplocation>
error-page>

2)error.jsp页面

<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" isErrorPage="true"%>
<body>
errorMsg:<%=exception.getMessage() %>
body>

你可能感兴趣的:(java)