Fork me on GitHub

JavaWeb

软件两大架构 B/S C/S

C/S

C:客户端 S:服务器 eg:QQ,LOL,WPS,就是桌面应用程序

特点

  1. 软件使用前必须安装
  2. 软件更新时,客户端和服务端也要更新
  3. 不能跨平台,就类似于手机版qq不能在电脑上安装
  4. cs软件通信采用自有协议,比较安全

B/S

B:浏览器, s 服务器 eg:淘宝网,京东网等网站

特点:

  1. 软件使用前不需要安装
  2. 软件更新时,只是服务端进行更新
  3. 能跨平台,必须有浏览器
  4. bs软件通信采用的是通用的HTTP协议,相对不安全

Tomcat

D:\apache-tomcat-8.0.21\conf\server.xml 可以修改端口号(默认8080),还要改eclipse→servers文件夹→server.xml

startup.bat 运行(前提是环境变量里有jAVA_HOME)

javaWeb

tomcat 放到javaweb中

首先javaEE→server →new→server→tomcat 8.0→tomcat根目录→finish

打开:start

错误404:找不到资源

错误500:服务器程序出错(空指针)

servelet

功能

  1. 接收用户请求的http协议,解析
  2. 返回一个http的响应协议,让浏览器去解析

workset结构

src放类

WebContent放页面,html,图片,js

WEB_INF受保护文件,配置文件,不能放页面文件

实现一个servlet

实现servlet接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.hpe.servelet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloServlet implements Servlet{
//构造;第一次请求执行,只执行一次
public HelloServlet() {
System.out.println("HelloServlet...");
}
//注销:执行一次,当servlet所在项目被卸载或者服务器被关闭时执行,用于释放资源
public void destroy() {
System.out.println("destory...");
}

public ServletConfig getServletConfig() {
return null;
}

public String getServletInfo() {
return null;
}
//初始化;第一次请求执行,只执行一次
public void init(ServletConfig arg0) throws ServletException {
System.out.println("init..........");
}
//多次被调用。每次请求都会执行service方法,实际用于获取请求响应结果
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("service...");
}
}

映射:让一个类在浏览器中运行,配置和映射servlet,给servlet一个浏览器的地址,方法如下(以后🙅‍自己配):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--  配置和映射servelet -->

<!-- 注册一个servelet -->
<servlet>
<!-- 注册名 -->
<servlet-name>hello</servlet-name>
<!-- 全类名,不要手敲,ctrl+c,v -->
<servlet-class>com.hpe.servelet.HelloServlet</servlet-class>
<!-- 指定servlet的一个创建时机 -->
</servlet>

<!-- 映射servelet -->
<servlet-mapping>
<!-- 下方name必须和注册名相同 -->
<servlet-name>hello</servlet-name>
<!-- 浏览器访问地址 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>

运行过程:访问路径→映射的访问地址→映射的name→注册名→全类名

生命周期

  1. 加载阶段:若是第一次请求加载并实例化(创建servlet实例)
  2. 初始化阶段:若是第一次请求,调用init()方法
  3. 响应客户请求阶段:无论第几次请求都调用service(),实际用于获取请求响应结果
  4. 终止阶段:destory(),当servlet所在项目被卸载或者服务器被关闭时执行,用于释放资源

<load-on-startup>1</load-on-startup>0和正数,加载的时候就创建实例,执行初始化,多个servlet时,数字越小,越先创建;负数,第一次访问时再创建实例初始化

config接口

servletConfig接口,代表当前servlet,可以获取当前servlet所有配置信息

  • getServletName():获取注册名
  • getServletContext():一般做全局数据共享,必须由servletConfig来获取,一个项目就一个context实例,每个servlet都可以访问到它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void init(ServletConfig config) throws ServletException {
System.out.println("init..........");
//ServletConfig:代表当前servlet,可以获取当前servlet所有配置信息
//1.getServletName()  获取当前Servlet在web.xml中配置的名字
System.out.println(config.getServletName());
//✪2.getServletContext() 获取代表当前web应用的ServletContext对象
ServletContext cxt=config.getServletContext();
System.out.println(cxt.getContextPath());//获取当前web应用的根目录
//3.getInitParameter(String) 获取当前Servlet指定名称的初始化参数的值
System.out.println(config.getInitParameter("username"));
//4.getInitParameterNames() 获取当前Servlet所有初始化参数的名字组成的枚举
Enumeration<String> names=config.getInitParameterNames();
while(names.hasMoreElements()){
//获取初始化参数名
String name=names.nextElement();
String value=config.getInitParameter(name);
System.out.println(name+":"+value);
}
}

零散知识点

  1. url格式:/aaa和*.aaa或者 /aaa/星,其中星代表所有字符

  2. ./ :代表文件所在的目录(可以省略不写)

    ../ :代表文件所在的父级目录

    ../../ :代表文件所在的父级目录的父级目录

    / :代表文件所在的根目录

  3. 相对路径变绝对路径:request.getContextPath()+"admin/main.jsp';"

  4. 项目中路径写绝对路径

  5. 初始化参数在loadup标签前面

  6. 创建的项目是项目,没有添加到workset里

    workset中添加项目:右键workset→proper…→选择→add→OK

  7. 浏览器访问地址以/开头

  8. servlet是单例的,只创建一次实例

  9. 配置文件改了,就必须重启服务器

  10. 加入jar包:项目右键→build path→library→add library→sever runtime→tomcat…→finish

  11. html是根标签,所有的都在html中

    title:浏览器上面的小框框的内容

    head:帮浏览器解析整个页面

    body:页面显示内容

    h2:标题

  12. 1
    <base href="<%=request.getContextPath()%>/">

    用来表明当前页面的相对路径所使用的根路径的。

httpservlet-不需要配置文件实现servlet

action:发送数据的服务器地址,method 默认get

id作用:正则表达式,判断用户输入的用户名是否符合规则,通过属性写正则表达式

三大域对象

✪把值存在域对象里,在别的页面通过域对象的方法获取域对象的值

获取web应用的初始化参数

获取项目的真实路径

✪作为域对象,保护多个用户共享的数据

1.(少)servletcontext:同一项目

类似一个全局变量,服务器开始就存在,服务器关闭才释放,一个项目就一个servletContext实例

ServletContext cxt = getServletContext();

1
2
3
4
5
6
7
8
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//ServletCOntext:代表当前web应用,相当于这个项目的全局变量
ServletContext con=getServletContext();
//获取真实路径
System.out.println(con.getRealPath("/"));
//获取项目的上下文,一般用来获取项目名
System.out.println(con.getContextPath());

​ getContextPath()一般用于获取当前项目名

2.httpsession:在同一次会话中
3.httpservletrequest:在同一次请求中

httpservletrequest是servletrequest(🙅‍获取http)的子接口

域对象三方法

setAttriubute():放一个数据到servlContext中,便于后面取出

getAttriubute():根据域对象名获取值

removeAttriubute():根据域对象名删除值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建servletContext
ServletContext cxt=getServletContext();
//获取域对象值
Object obj=cxt.getAttribute("count");
//如果是第一次访问,设置访问量为1
int count=0;//保存访问量
if(obj==null){
count=1;
}else{
//不是第一次。加1
count=((int)obj)+1;
}
//设置域对象值
cxt.setAttribute("count", count);
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("访问量:"+count);
}

request和response

两种请求方式:

get方式(默认)
1.以地址栏的方式传输
2.会把用户输入的值显示在地址栏,不安全
3.速度快 查询用get()

post

1.文件形式传输
2.安全,传输数据大,增删改用post()

doget和dopost被service方法调用

两个方法改变了参数,针对http请求

request

获取用户参数,转发,作为域对象也可以存放数据

getParameter(String):根据参数获取值,返回类型为String[]

getparameterValues(String):根据名获取一组值,返回类型为String[]

getParameterNames ()方法 :获取所有参数的名字,返回类型为Enumeration

setCharacterEncoding(“utf-8”);

getContextPath()

response

getWriter():输出对象

response.setContentType("text/html;charset=utf-8");

输出对象

1
2
PrintWriter out = response.getWriter();
out.write();

把内容输出到浏览器上

servlet对象

Requestresponse在每一次访问时都被创建。由容器创建的

Serlvet只会被创建一次,由用户来开发,由容器来创建,单一的实例。

ServletConfig会为每一个Servlet创建一个Config对象,且由Servlet维护。就是声明成了成员变量。

ServletContext对象,代表web应用,这一个项目就只有一个此对象。

解决乱码问题:

页面,类,浏览器,tomcat编码格式必须相同

第一种

针对于get和post

1
2
3
4
5
response.setContentType("text/html;charset=utf-8");
String name=request.getParameter("name");//name是iso-8859-1格式
byte[] byte1=name.getBytes("iso-8859-1");//把name转成字节码
String name1=new String(byte1,"utf-8");
out.write("姓名:"+name1);

第二种(推荐)

只对post有效

1
2
3
4
5
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");//必须放在接受参数之前
PrintWriter out = response.getWriter();
String name=request.getParameter("name");
out.write("姓名:"+name);

对于get方式,tomcat8.0默认配置转成UTF-8,8.0之前,默认ISO-8859-1,在改端口号的两个server.xml中的Connector节点加入URIEncoding=utf-8

✪请求转发,请求重定向

  1. 请求转发:地址栏还是初次请求的地址栏,

    请求重定向:地址栏是最后一次响应的地址栏

  2. 本质区别:请求转发只发送一次一次请求,而重定向发送多次

  3. 请求转发:在最终的servlet中,request和中转的request是同一个request

    重定向:不是同一个request

  4. 请求转发:/代表的是当前web应用的根目录,代表绝对路径http://localhost:8080/servlet02

    请求重定向:/代表的是当前web站点的根目录http://localhost:8080

  5. 请求转发只能转发内部资源,请求重定向可以转发外部资源

  6. 外包是转发,还给服务器并告诉服务器谁可以完成任务为重定向

session

  1. 一次会话:浏览器打开到浏览器关闭
  2. 在服务器端保持http状态信息的方案
  3. 客户请求里是否包含session标识表明是否是第一次访问
  4. 如果当前已经创建了session,则直接返回,如果没有创建,就创建一个session
  5. 数据共享:在同一个会话中
0%