栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaWeb(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb(二)

文章目录

6、Servlet

6.1、Servlet简介6.2、HelloServlet6.3、Servlet原理6.4、Mapping问题6.5、ServletContext

1、共享数据2、获取初始化参数3、请求转发4、读取资源文件 6.6、HttpServletResponse

1、简单分类2、下载文件3、验证码功能4、实现重定向5、简单实现登录重定向 6.7、HttpServletRequest 7、cookie、Session

7.1、会话7.2、保存会话的两种技术7.3、cookie7.4、Session(重点) 8、JSP

8.1、什么是JSP8.2、JSP原理8.3、JSP基础语法8.4、JSP指令8.5、9大内置对象8.6、JSP标签、JSTL标签、EL表达式 9、JavaBean10、MVC三层架构

10.1、早些年10.2、MVC三层架构 11、Filter (重点)12、监听器13、过滤器、监听器常见应用


6、Servlet 6.1、Servlet简介

Servlet就是sun公司开发动态web的一门技术Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小骤:

编写一个类,实现Servlet接口把开发好的Java类部署到web服务器中。

把实现了Servlet接口的Java程序叫做,Servlet

6.2、HelloServlet

Serlvet接口Sun公司有两个默认的实现类:HttpServlet,GenericServlet

    构建一个普通的Maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Moudel;这个空的工程就是Maven主工程;

    关于Maven父子工程的理解:
    父项目中会有

    
    	servlet-01
    
    

    子项目会有

    
    	javaweb-02-servlet
    	com.kuang
    	1.0-SNAPSHOT
    
    

    父项目中的java子项目可以直接使用

    son extends father
    

    Maven环境优化

      修改web.xml为最新的将maven的结构搭建完整

    编写一个Servlet程序

      编写一个普通类实现Servlet接口,这里我们直接继承HttpServlet
    public class HelloServlet extends HttpServlet {
    //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样;
    	@Override
    	protected void doGet(HttpServletRequest req,
    	HttpServletResponse resp) throws ServletException, IOException {
    		//ServletOutputStream outputStream =			resp.getOutputStream();
    		PrintWriter writer = resp.getWriter(); //响应流
    		writer.print("Hello,Serlvet");
    	}
    	@Override
    	protected void doPost(HttpServletRequest req,
    	HttpServletResponse resp) throws ServletException, IOException {
    		doGet(req, resp);
    	}
    }
    

    编写Servlet的映射
    为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;

    
    
    	hello
    	com.kuang.servlet.HelloServlet
    
    
    
    	hello
    	/hello
    
    

    配置Tomcat
    注意:配置项目发布的路径就可以了

    启动测试,OK!

6.3、Servlet原理

Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:

6.4、Mapping问题

    一个Servlet可以指定一个映射路径

    
    	hello
    	/hello
    
    

    一个Servlet可以指定多个映射路径

    
    	hello
    	/hello
    
    
    	hello
    	/hello2
    
    
    	hello
    	/hello3
    
    
    	hello
    	/hello4
    
    
    	hello
    	/hello5
    
    

    一个Servlet可以指定通用映射路径

    
    	hello
    	/hello
    	resp.sendRedirect("/r/img");//重定向
    }
    

    面试题:请你聊聊重定向和转发的区别?
    相同点

    页面都会实现跳转

    不同点

    请求转发的时候,url不会产生变化重定向时候,url地址栏会发生变化;

    5、简单实现登录重定向
    <%--这里提交的路径,需要寻找到项目的路径--%>
    <%--${pageContext.request.contextPath}代表当前的项目--%>
    
    用户名:
    密码:
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    	//处理请求
    	String username = req.getParameter("username");
    	String password = req.getParameter("password");
    	System.out.println(username+":"+password);
    	//重定向时候一定要注意,路径问题,否则404;
    	resp.sendRedirect("/r/success.jsp");
    }
    
    
    	requset
    	com.kuang.servlet.RequestTest
    
    
    	requset
    	/login
    
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
    	Title
    
    
    
    

    Success

    6.7、HttpServletRequest

    HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;

    获取参数,请求转发

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    	req.setCharacterEncoding("utf-8");
    	resp.setCharacterEncoding("utf-8");
    	String username = req.getParameter("username");
    	String password = req.getParameter("password");
    	String[] hobbys = req.getParameterValues("hobbys");
    	System.out.println("=============================");
    	//后台接收中文乱码问题
    	System.out.println(username);
    	System.out.println(password);
    	System.out.println(Arrays.toString(hobbys));
    	System.out.println("=============================");
    	System.out.println(req.getContextPath());
    	//通过请求转发
    	//这里的 / 代表当前的web应用
    	req.getRequestDispatcher("/success.jsp").forward(req,resp);
    }
    

    面试题:请你聊聊重定向和转发的区别?
    相同点

    页面都会实现跳转
    不同点请求转发的时候,url不会产生变化 307重定向时候,url地址栏会发生变化; 302 7、cookie、Session 7.1、会话

    会话: 用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
    有状态会话: 一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
    你能怎么证明你是西开的学生?
    你 西开

      发票 西开给你发票学校登记 西开标记你来过了

    一个网站,怎么证明你来过?
    客户端 服务端

      服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie服务器登记你来过了,下次你来的时候我来匹配你; seesion
    7.2、保存会话的两种技术

    cookie

    客户端技术 (响应,请求)

    session

    服务器技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!

    常见:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!

    7.3、cookie

      从请求中拿到cookie信息服务器响应给客户端cookie
    cookie[] cookies = req.getcookies(); //获得cookie
    cookie.getName(); //获得cookie中的key
    cookie.getValue(); //获得cookie中的vlaue
    new cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
    cookie.setMaxAge(24*60*60); //设置cookie的有效期
    resp.addcookie(cookie); //响应给客户端一个cookie
    

    cookie:一般会保存在本地的 用户目录下 appdata;

    一个网站cookie是否存在上限!聊聊细节问题

    一个cookie只能保存一个信息;一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;cookie大小有限制4kb;300个cookie浏览器上限

    删除cookie;

    不设置有效期,关闭浏览器,自动失效;设置有效期时间为 0 ;

    编码解码:

    URLEncoder.encode("秦疆","utf-8")
    URLDecoder.decode(cookie.getValue(),"UTF-8")
    
    7.4、Session(重点)


    什么是Session:

    服务器会给每一个用户(浏览器)创建一个Seesion对象;一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……


    Session和cookie的区别:

    cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)Session对象由服务创建;

    使用场景:

    保存一个登录用户的信息;购物车信息;在整个网站中经常会使用的数据,我们将它保存在Session中;

    使用Session:

    package com.kuang.servlet;
    import com.kuang.pojo.Person;
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    public class SessionDemo01 extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    	throws ServletException, IOException {
    	//解决乱码问题
    	req.setCharacterEncoding("UTF-8");
    	resp.setCharacterEncoding("UTF-8");
    	resp.setContentType("text/html;charset=utf-8");
    	//得到Session
    	HttpSession session = req.getSession();
    	//给Session中存东西
    	session.setAttribute("name",new Person("秦疆",1));
    	//获取Session的ID
    	String sessionId = session.getId();
    	//判断Session是不是新创建
    	if (session.isNew()){
    		resp.getWriter().write("session创建成功,ID:"+sessionId);
    	}else {
    		resp.getWriter().write("session以及在服务器中存在
    		了,ID:"+sessionId);
    	}
    	//Session创建的时候做了什么事情;
    	// cookie cookie = new cookie("JSESSIONID",sessionId);
    	// resp.addcookie(cookie);
    	}
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    	throws ServletException, IOException {
    		doGet(req, resp);
    	}
    }
    //得到Session
    HttpSession session = req.getSession();
    Person person = (Person) session.getAttribute("name");
    System.out.println(person.toString());
    HttpSession session = req.getSession();
    session.removeAttribute("name");
    //手动注销Session
    session.invalidate();
    

    会话自动过期:web.xml配置

    
    
    	
    	15
    
    

    8、JSP 8.1、什么是JSP

    Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术!
    最大的特点:

    写JSP就像在写HTML区别:

    HTML只给用户提供静态的数据JSP页面中可以嵌入JAVA代码,为用户提供动态数据; 8.2、JSP原理

    思路:JSP到底怎么执行的!

    代码层面没有任何问题

    服务器内部工作
    tomcat中有一个work目录;
    IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录

    我电脑的地址:

    发现页面转变成了Java程序!

    浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
    JSP最终也会被转换成为一个Java类!
    JSP 本质上就是一个Servlet

    //初始化
    public void _jspInit() {
    }
    //销毁
    public void _jspDestroy() {
    }
    //JSPService
    public void _jspService(.HttpServletRequest request,HttpServletResponse
    response)
    
      判断请求内置一些对象
    final javax.servlet.jsp.PageContext pageContext; //页面上下文
    javax.servlet.http.HttpSession session = null; //session
    final javax.servlet.ServletContext application; //applicationContext
    final javax.servlet.ServletConfig config; //config
    javax.servlet.jsp.JspWriter out = null; //out
    final java.lang.Object page = this; //page:当前
    HttpServletRequest request //请求
    HttpServletResponse response //响应
    
      输出页面前增加的代码
    response.setContentType("text/html"); //设置响应的页面类型
    pageContext = _jspxFactory.getPageContext(this, request, response,
    null, true, 8192, true);
    _jspx_page_context = pageContext;
    application = pageContext.getServletContext();
    config = pageContext.getServletConfig();
    session = pageContext.getSession();
    out = pageContext.getOut();
    _jspx_out = out;
    
      以上的这些个对象我们可以在JSP页面中直接使用!


    在JSP页面中;
    只要是 JAVA代码就会原封不动的输出;
    如果是HTML代码,就会被转换为:

    out.write("rn");
    

    这样的格式,输出到前端!

    8.3、JSP基础语法

    任何语言都有自己的语法,JAVA中有,。 JSP 作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!),Java所有语法都支持!

    JSP表达式

    <%--JSP表达式
    作用:用来将程序的输出,输出到客户端
    <%= 变量或者表达式%>
    --%>
    <%= new java.util.Date()%>
    

    jsp脚本片段

    <%--jsp脚本片段--%>
    <%
    int sum = 0;
    for (int i = 1; i <=100 ; i++) {
    sum+=i;
    }
    out.println("Sum="+sum+"");
    %>
    

    脚本片段的再实现

    <%
    	int x = 10;
    	out.println(x);
    %>
    	

    这是一个JSP文档

    <% int y = 2; out.println(y); %>
    <%--在代码嵌入HTML元素--%> <% for (int i = 0; i < 5; i++) { %>

    Hello,World <%=i%>

    <% } %>

    JSP声明

    <%!
    static {
    	System.out.println("Loading Servlet!");
    }
    private int globalVar = 0;
    public void kuang(){
    	System.out.println("进入了方法Kuang!");
    }
    %>
    

    JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!
    在JSP,嵌入Java代码即可!

    <%%>
    <%=%>
    <%!%>
    <%--注释--%>
    

    JSP的注释,不会在客户端显示,HTML就会!

    8.4、JSP指令
    <%@page args.... %>
    <%@include file=""%>
    
    <%--@include会将两个页面合二为一--%>
    
    <%@include file="common/header.jsp"%>
    

    网页主体

    <%@include file="common/footer.jsp"%>
    <%--jSP标签 jsp:include:拼接页面,本质还是三个 --%>

    网页主体

    8.5、9大内置对象

    PageContext 存东西Request 存东西ResponseSession 存东西Application 【SerlvetContext】 存东西config 【SerlvetConfig】outpage ,不用了解exception

    pageContext.setAttribute("name1","秦疆1号"); //保存的数据只在一个页面中有效
    request.setAttribute("name2","秦疆2号"); //保存的数据只在一次请求中有效,请求转发会携
    带这个数据
    session.setAttribute("name3","秦疆3号"); //保存的数据只在一次会话中有效,从打开浏览器
    到关闭浏览器
    application.setAttribute("name4","秦疆4号"); //保存的数据只在服务器中有效,从打开服
    务器到关闭服务器
    

    request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
    session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
    application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

    8.6、JSP标签、JSTL标签、EL表达式
    
    
    	javax.servlet.jsp.jstl
    	jstl-api
    	1.2
    
    
    
    	taglibs
    	standard
    	1.1.2
    
    

    EL表达式: ${ }

    获取数据执行运算获取web开发的常用对象

    JSP标签

    <%--jsp:include--%>
    
    <%--
    http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
    --%>
    
    
    	
    	
    
    

    JSTL表达式
    JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!
    格式化标签
    SQL标签
    XML 标签
    核心标签 (掌握部分)

    JSTL标签库使用步骤

    引入对应的 taglib使用其中的方法在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误

    c:if

    
    	Title
    
    
    
    

    if测试


    <%-- EL表达式获取表单中的数据 ${param.参数名} --%>
    <%--判断如果提交的用户名是管理员,则登录成功--%> <%--自闭合标签--%>

    c:choose c:when

    
    <%--定义一个变量score,值为85--%>
    
    
    
    	
    		你的成绩为优秀
    	
    	
    		你的成绩为一般
    	
    	
    		你的成绩为良好
    	
    	
    		你的成绩为不及格
    	
    
    
    

    c:forEach

    <%
    	ArrayList people = new ArrayList<>();
    	people.add(0,"张三");
    	people.add(1,"李四");
    	people.add(2,"王五");
    	people.add(3,"赵六");
    	people.add(4,"田六");
    	request.setAttribute("list",people);
    %>
    <%--
    var , 每一次遍历出来的变量
    items, 要遍历的对象
    begin, 哪里开始
    end, 到哪里
    step, 步长
    --%>
    
    	 


    9、JavaBean

    实体类
    JavaBean有特定的写法:

    必须要有一个无参构造属性必须私有化必须有对应的get/set方法;

    一般用来和数据库的字段做映射 ORM;
    ORM :对象关系映射

    表—>类字段–>属性行记录---->对象

    people表

    class People{
    	private int id;
    	private String name;
    	private int id;
    	private String address;
    }
    class A{
    	new People(1,"秦疆1号",3,"西安");
    	new People(2,"秦疆2号",3,"西安");
    	new People(3,"秦疆3号",3,"西安");
    }
    

    过滤器文件上传邮件发送JDBC 复习 : 如何使用JDBC , JDBC crud, jdbc 事务 10、MVC三层架构

    什么是MVC: Model view Controller 模型、视图、控制器

    10.1、早些年


    用户直接访问控制层,控制层就可以直接操作数据库;

    servlet--CRUD-->数据库
    弊端:程序十分臃肿,不利于维护
    servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
    
    架构:没有什么是加一层解决不了的!
    程序猿调用
    |
    JDBC
    |
    Mysql Oracle SqlServer ....
    
    10.2、MVC三层架构


    Model

    业务处理 :业务逻辑(Service)数据持久层:CRUD (Dao)

    View

    展示数据提供链接发起Servlet请求 (a,form,img…)

    Controller (Servlet)

    接收用户的请求 :(req:请求参数、Session信息….)交给业务层处理对应的代码控制视图的跳转

    登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,
    password)---->交给业务层处理登录业务(判断用户名密码是否正确:事务)--->Dao层查询用
    户名和密码是否正确-->数据库
    
    11、Filter (重点)

    Filter:过滤器 ,用来过滤网站的数据;

    处理中文乱码登录验证….


    Filter开发步骤:

      导包

      编写过滤器

        导包不要错

        实现Filter接口,重写对应的方法即可
      public class CharacterEncodingFilter implements Filter {
      	//初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
      	public void init(FilterConfig filterConfig) throws		ServletException {
      		System.out.println("CharacterEncodingFilter初始化");
      	}
      	//Chain : 链
      	
      	public void doFilter(ServletRequest request, ServletResponse	response, FilterChain chain) throws IOException, ServletException {
      		request.setCharacterEncoding("utf-8");
      		response.setCharacterEncoding("utf-8");
      		response.setContentType("text/html;charset=UTF-8");
      		System.out.println("CharacterEncodingFilter执行前....");
      		chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
      		System.out.println("CharacterEncodingFilter执行后....");
      	}
      	//销毁:web服务器关闭的时候,过滤会销毁
      	public void destroy() {
      		System.out.println("CharacterEncodingFilter销毁");
      	}
      }
      

      在web.xml中配置 Filter

      
      	CharacterEncodingFilter
      	com.kuang.filter.CharacterEncodingFilter
      
      
      	CharacterEncodingFilter
      	
      	/servlet
      }
      
        web.xml中注册监听器
      
      	com.kuang.listener.OnlineCountListener
      
      
        看情况是否使用!
      13、过滤器、监听器常见应用

      监听器:GUI编程中经常使用;

      public class TestPanel {
      	public static void main(String[] args) {
      		frame frame = new frame("中秋节快乐"); //新建一个窗体
      		Panel panel = new Panel(null); //面板
      		frame.setLayout(null); //设置窗体的布局
      		
      		frame.setBounds(300,300,500,500);
      		frame.setBackground(new Color(0,0,255)); //设置背景颜色
      		
      		panel.setBounds(50,50,300,300);
      		panel.setBackground(new Color(0,255,0)); //设置背景颜色
      		
      		frame.add(panel);
      		frame.setVisible(true);
      		
      		//监听事件,监听关闭事件
      		frame.addWindowListener(new WindowAdapter() {
      			@Override
      			public void windowClosing(WindowEvent e) {
      				super.windowClosing(e);
      			}
      		});
      	}
      }
      

      用户登录之后才能进入主页!用户注销后就不能进入主页了!

        用户登录之后,向Sesison中放入用户的数据

        进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        
        if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
        	response.sendRedirect("/error.jsp");
        }
        chain.doFilter(request,response)
        
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号