Javaweb阶段性总结

学习Javaweb也有好多天了,都是零零散散的学习,并没有系统化。今天上午做完算法题,下午就来总结一下Javaweb的一些小的知识,这篇文章知识针对我我自己的一些不理解的地方,易忘记的一些知识点。(本文按照how2j网站编写,相当于自己的学习笔记)

第一个知识点:

http://127.0.0.1/login.html访问的是html页面,http://127.0.0.1/login访问的是login映射的servlet

第二个知识点:servlet和前端的调用流程

 第三个知识点:转发与重定向

第三个知识点:request的常用方法

request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)" 
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名" 
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POST

request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。

上边标红的是最常用的一些方法!!!

第四个知识点:response的常用方法

response.setContentType("text/html; charset=UTF-8");//设置相应编码

response.sendRedirect("fail.html");//设置从定向的功能

第五个知识点:文件上传

这个我会单独的写一篇文章来说明这个功能

第六个知识点:关于访问路径的问题

比如这个addHero.html文件,是放在abc目录下。

那么<form action="addHero" method="post"> 就表示访问路径: /abc/addHero

而<form action="/addHero" method="post"> 表示访问路径: /addHero

第七个知识点:若遇到更新数据的业务需求

那就必须增加一行type="hidden"的input,用于提交id到路径/updateHero

如下图所示:(下面只是其中一种思路,当然可以直接将id值从一个jsp种传入另一个jsp种,这两种方式的关键点就是获取id值并修改相应的信息)

 第八个知识点:jsp的执行流程

第九个知识点:jsp中的元素

 

第十个知识点:什么是cookie以及他的应用

 Cookie是一种浏览器和服务器交互数据的方式。Cookie是由服务器端创建,但是不会保存在服务器。创建好之后,发送给浏览器。浏览器保存在用户本地。下一次访问网站的时候,就会把该Cookie发送给服务器。

有的网站,登陆的时候,会出现一个选项,问你是否要一周内或者一个月内保持登陆状态。如果你选了,那么一周之内,都不需要再输入账号密码。这个功能,就是靠cookie来实现的。

 第十一个知识点:session原理

会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。

第十二个知识点:JSTL和EL

JSTL通过<c:if test=""> 进行条件判断但是JSTL没有<c:else,所以常用的办法是在<c:if的条件里取反,配合if使用的还有通过empty进行为空判断,empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0 

 借助JSTL的c:forEach标签,可以改善可读性,分别使用for循环和<c:forEach标签来演示遍历一个List的区别
 

<c:forEach items="${heros}" var="hero" varStatus="st" >
items="${heros}" 表示遍历的集合
var="hero" 表示把每一个集合中的元素放在hero上
varStatus="st" 表示遍历的状态

使用JSTL还有一个最最最最易错的地方,就是忘记了<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>这个地方也是我之前出现错误最多的地方。

第十三个知识点:判断用户是否登陆

比如网站提供Hero查询服务,但是前提是用户要登录过才能使用。 如果用户登陆过了,访问listHero,就让用户正常访问,否则就跳转到登陆界面。 这是非常常见的场景,通过使用 session 来实现这个功能。 在处理登录的loginServlet 中使用将用户名保存在session中。 在HeroListServlet 中查看session中是否为空。如果为空,就表示用户没有登陆过,就跳转到登陆页面

 

第十四个知识点:Filter原理与使用

Filter最常用的两种方式是设置编码和登陆验证

设置编码:

package filter;
 
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class EncodingFilter implements Filter {
 
    @Override
    public void destroy() {
 
    }
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
 
        request.setCharacterEncoding("UTF-8");
 
        chain.doFilter(request, response);
    }
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
 
    }
 
}

 登陆验证:

package filter;
 
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class AuthFilter implements Filter {
 
    @Override
    public void destroy() {
 
    }
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
 
        String uri = request.getRequestURI();
        if (uri.endsWith("login.html") || uri.endsWith("login")) {
            chain.doFilter(request, response);
            return;
        }
 
        String userName = (String) request.getSession().getAttribute("userName");
        if (null == userName) {
            response.sendRedirect("login.html");
            return;
        }
 
        chain.doFilter(request, response);
    }
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
 
    }
 
}

因为这个过滤器的存在,在登陆之前所有的资源都不能访问。 所以在login.jsp上如果有图片,js和css,也不能够正常显示和工作。

这样做当然是不行的,那么如何让js css和图片文件即使在不登陆的情况下,也可以访问呢

package filter;
  
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
  
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
public class AuthFilter implements Filter {
  
    @Override
    public void destroy() {
  
    }
  
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
  
        String uri = request.getRequestURI();
         
        //如果访问的资源是以css或者js结尾的,那么就不需要判断是否登录
        if (uri.endsWith(".css") || uri.endsWith(".js")) {
            chain.doFilter(request, response);
            return;        
        }
         
        if (uri.endsWith("login.html") || uri.endsWith("login")) {
            chain.doFilter(request, response);
            return;
        }
         
        String userName = (String) request.getSession().getAttribute("userName");
        if (null == userName) {
            response.sendRedirect("login.html");
            return;
        }
  
        chain.doFilter(request, response);
    }
  
    @Override
    public void init(FilterConfig arg0) throws ServletException {
  
    }
  
}

 

 就总结到这吧,我感觉这些内容是我要必须多看的内容,继续努力吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值