第一章-Web基础部分

1tomcat服务器

1.1 是什么

免费的开放源代码的Web 应用服务器

1.2下载以及安装、使用

修改端口号:conf–>servlet.xml–>第70行<Connector port="8088"修改端口号

放置项目:webapps下放置写好的项目

1.3 Http请求/响应

是什么:http(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

  • 文本:HTML,字符串

  • 超文本:图片、音乐、视频等。

  • 端口号:80

    Https:安全的超文本传输协议。端口号443

1 Http请求

客户端–发请求–服务器

1
2
3
4
RequestURL:https://note.youdao.com/ 请求URL地址
Request Method: POST   请求方式
Status Code: 200 OK    状态码
Remote Address: 123.58.182.251:443  请求IP地址

2 Http响应

服务器–响应–客户端

1
2
3
4
Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8

2 请求行

请求方式:Get,Post,Head,Delete,Put,Tract

  • Get:请求能携带参数少,大小限制1024KB,在浏览器的URL显示数据,不安全,但是高效。
  • Post:请求能携带参数无限制,大小无限制,不会在URL显示数据内容,安全,速度相对GET低。

1.4 初始web.xml

根据不同tomcat配置信息不同:在webapp–>ROOT–>WEB-INF->web.xml可以配置初始的信息

1.5 Servlet

servlet介绍:

  • Servlet就是sun公司开发动态web的一门技术

  • Sun在这些API中提供-一个接口叫做: Servlet

    使用servlet步骤:1实现servlet的类。2把类部署到web服务器(web.xml中部署)

servlet运行原理:

  • **创建过程:**先写一个servlet的类,就是实现了servlet接口的类,一般直接继承HttpServle。然后把它放置在web容器中,就是在web.xml写mapping,我们可以用标签控制servle的创建时机,是Tomcat启动时创建还是,客户端请求servlet时才创建。

  • **生命周期:**当客户端请求Servlet时,web容器就会去寻找对应的Servlet,创建一个对象,执行init方法初始化,然后再执行service方法,根据对应的请求方式执行doxxx方法,当再此请求这个servlet时候,就去直接执行service方法了,当web容器关闭前,会执行destroy方法进行销毁。

转发/跳转 response.sendRedirect(“网址”) 重定向告诉它待会要跳转到该页面 req.getRequestDispatcher(“网址”).forword(req,resp) 在servlet中将当前req,resp转发到网址

1.6Servlet和Filter区别

1.共同点 ●都有三个常用方法:初始化,销毁,核心方法( service,doFilter )。 ●它们在核心方法都有request,response. ●它们都是单例的,一个应用只有一一个对象。 2.区别点 ■创建时间 Servlet请求第一次到达时创建 (默认) Filter项目启动时创建 是否资源 Servet是一一个资源 ,可以通过路径访问 Filter不是一个资源 ,不可以通过路径访问 ●用范围 1Servlet能做的, Filter都能做到,但是反过来这不然。

2内置对象

我们在实际使用Cookie过程中要注意一些问题:

  1. Cookie的兼容性问题

  Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。

  2. Cookie的内容

  同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为“Test_Content”的原因。

  虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符。

El和JSTL

1EL表达式

作用:获取作用域对象的数据 仅仅获取pageContext、request、session、application四个对象中的数据 找到了获取,找不到什么都不做,也不报错

request对象存储了请求数据–> ${param.键名} paramvalues.键名 返回的是数组

通过setAttribute方法存储到作用域对象中的数据 ${键名}返回键名对应的值 若是String返回String

若是对象返回对象 ${键名.属性.属性}

若是List集合对象 ${键名[下标]}

若是map集合 ${集合名.map集合存储的键名}

默认:若是相同键则从pageContext开始找,一直往作用域大的找 ${pageScope.键} ${requestScope.键} ${sessionScope.键} ${applicationScope.键}

EL逻辑运算: ${1+3}–>4 ${a+b}会报错 这里的+-*/是运算 +不是字符连接 ${requestScope.con.name eq “张三”} ${receiveInfo.isread == ‘是’.charAt(0)} 字符串和字符进行比较

EL空值判断 ${empty 键名} 会返回true 和false

${cardtype.oid==typeid?‘selected’:''}可以直接放在select中的option,不需要再加””

Cookie数据 ${cookie}返回存储了索引cookie对象的map集合 ${cookie.键}取出对应键的cookie对象 不常用 ${cookie.键.value}取出cookie对象的值 ${cookie.键.name}取出cookie对象的名字

2JSTL表达式

1使用前加入依赖 2jsp声明Jstl标签库引入(核心标签库)

<%@ taglib prefix="c” uri="http://java.sun.com/jsp/jstl/core”%>

注意:JSTL依赖EL,EL只能四个作用域中的变量,所以使用前要先存入作用域中 。

JSTL–声明变量

1
2
3
4
5
6
7
8
9
输出:相当于<%=${键} %>
<c:out value="常量也可以变量${键}" default="当变量不存在"></c:out>

存储:向定义域存储一个变量
<c:set var="hello"  value="hello pageContext" 
       scope="page/request/session/application"></c:set> 

删除:未指定scope则删除所有
<c:remove var="people" scope="request">

JSTL–if判断

1
2
3
4
<c:if test="${键>0}">
符合if条件执行的代码
</c:if>
${list.size()>0}获取list集合的长度

JSTL–choose选择判断

1
2
3
4
5
6
7
8
当符合某一条件 就不再执行
<c:choose>
	<c:when test="${score>=60&&score<70}">恭喜及格啦</c:when>
		<c:when test="${score==60}">你60分</c:when>
			<c:otherwise>
			不符合条件执行:	提升分数请拨打119120110  
			</c:otherwise>
</c:choose>

JSTL–forEach循环

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<!--for循环
step是步长 varStatus="状态名如vs"
vs.index执行下标  vs.count执行次数
vs.first是否第一次循环  vs.last是否最后一次循环 -->
 <c:forEach begin="1" end="4"  step="2" varStatus="vs">
卢森林${vs.index }--${vs.count }<br/>
 </c:forEach>

<!-- 变量循环
  items="${arr}"声明要遍历的对象
  var="str"声明每次遍历获得的值的对象
  如果是map键值对形式,str.key,str.value -->
<c:forEach items="${arr}" var="str">
  <br>双双三--${str}
</c:forEach>

format格式化标签 需要引入<%@ taglib prefix="fmt” uri="http://java.sun.com/jsp/jstl/fmt” %>命名空间

1
2
3
4
5
6
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %>
把Date类型转化为特定的类型
	<fmt:formatDate value="${time}" pattern="yyyy-MM-dd HH:mm:ss" />
把Date转为字符串
	<fmt:formatNumber value="12.34" pattern="#0.00" />   12.34  保留小数点后两位数
	<fmt:formatNumber value="12" type="currency" pattern="$.00"/> -- $12.00

web项目需要的jiar

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--jsp依赖-->
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>javax.servlet.jsp-api</artifactId>
  <version>2.3.3</version>
  <scope>provided</scope>
</dependency>

<!--servlet依赖-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>

<!--jstl依赖-->
<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

第二章-

1验证码

1加入jir包 verifycode.jar

2jsp页面中

1
2
3
4
5
function changeCode(){
var name=document.getElementById("checkImg");
name.src="register!generateVerifyCodeImg?="+new Date;
}
<img id="checkImg" src="register!generateVerifyCodeImg" onclick="changeCode()">

3servlet/action/controller

1
2
3
4
5
6
//action中,每次更换验证码就会生成一次action
public void generateVerifyCodeImg() throws IOException {
String code= VerifyCodeUtil.generateVerifyCode(4);
ServletActionContext.getRequest().getSession().setAttribute("code", code);
HttpServletResponse response=ServletActionContext.getResponse();
VerifyCodeUtil.outputImage(100, 40, response.getOutputStream(), code);}

2记住密码

1servlet/action/controller

1
2
3
4
5
6
7
8
9
if(avoidLogin==true){
    Cookie cookieName=new Cookie("userName",user.getUsers_name());
    Cookie cookiePassword=new Cookie("userPassword",user.getUsers_password());
    cookieName.setMaxAge(5000);
    ServletActionContext.getResponse().addCookie(cookieName);

    cookiePassword.setMaxAge(5000);
    ServletActionContext.getResponse().addCookie(cookiePassword);
}

2jsp中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$(function(){
    // 判断Cookie中是否有值,有值则回显,反之就不用管了
    if("${cookie.userName.value}"!=''&&"${cookie.userPassword.value}"!=''){
        $("#users_name").val("${cookie.userName.value}");
        $("#users_password").val("${cookie.userPassword.value}");
        // 这个事件可以模拟“我”直接触发登录的那个点击事件
        //$('#dl').trigger("click");
        alert("有么?"+${cookie.userPassword.value});
    }
});

3获得上次地址

getRequest().getHeader(“Referer”);

4Filter过滤器

1java类实现Filter接口

  1. init()方法服务器启动就执行,资源初始化 arg0.getInitParameter(“encod”);获得初始化时值

  2. doFilter()方法

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    //拦截请求方法,在此方法中可以对资源实现管理
     //注意要手动放行,
    chain.doFilter(arg0, arg1);
    //在doFilter()后是对响应进行处理
     HttpServletRequest hs=(HttpServletRequest)arg0;
    String ServlertPath2=hs.getServletPath(); //   获得 /login.jsp
       
    //获取Httpservlet对象
    HttpServletRequest hRequert= (HttpServletRequest) request;
    HttpServletResponse hResponse=(HttpServletResponse)response;
    //常用方法
    hRequert.getRequestDispatcher().forward("xxx");//转发
    hResponse.sendRedirect("book!findAllBook");//重定向 重定向还是会继续执行代码
    
  3. destroy()方法 服务器关闭的时候执行

2web.xml配置过滤器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<filter>
  	<filter-name>MyFilter</filter-name>//过滤器名称要一致
  	<filter-class>com.lx.L7.MyFilter</filter-class>//过滤器位置
	<init-param>
  		<param-name>encod</param-name>设置filter附带的键值
  		<param-value>UTF-8</param-value>
  	</init-param>
</filter>
<filter-mapping>
  <filter-name>MyFilter</filter-name>//过滤器名称
  <url-pattern>/</url-pattern>//表示拦截所有
</filter-mapping>
		若只拦截部分<url-pattern>.do</url-pattern>拦截.do结尾的

​ 统一编码格式设置,session管理,权限管理 资源管理(统一水印)