JavaEE Day14 Servlet&HTTP&Request&BeanUtils介绍

Servlet类体系结构,两个子抽象类,需要继承HttpServlet而不是GenericServlet,并重写doget和dopost

一个servlet可以定义多个访问路径(注解): @WebServlet({"/demo4","/dd4"})

Hyper Text Transfer Protocol,定义客户端与服务器端通信时发送数据的格式,基于TCP/IP协议,默认80端口

基于请求响应,连接可以复用,请求过程无需建立新连接

request请求头格式:GET /login.html  HTTP1.1,get不安全

request获取请求消息,response设置响应消息

Request对象的继承体系:ServletRequest-HttpServletRequest-tomcat创建了实现类

常见方法:getContextPath()、getRemoteAddr()、getRequestURI()、getParameter/Name/Values/Map()

get方式无乱码,post方式乱码解决:request.setCharacterEncoding("utf-8");

请求转发:服务器内部进行资源跳转(多个转发属于一个请求)---request.getRequestDispatcher(String path).forward(ServletRequest request,ServletResponse response),地址栏路径不会发生变化,只能转发到服务器内部资源

在有作用范围的对象中,可以在范围内共享数据(域对象),获取作用域对象(项目虚拟目录):ServletContext getServletContext()

request域:一次请求的范围内部,可以在请求转发过程中共享数据,setAttribute、getAttribute、removeAttribute

Druid连接池的Utils工具类

public class UserDao {//声明JDBCTemplate对象公用private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** 文档注释:登录方法* @param loginUser 只有用户名和密码* @return User 包含用户全部数据;没有查询到,返回null* 需要使用druid连接池才能实现,先创建一个工具类*/public User login(User loginUser){try {//1.编写sqlString sql= "select * from user where username = ? and password = ?";//2.调用query方法User user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),loginUser.getUsername(), loginUser.getPassword());return user;} catch (DataAccessException e) {e.printStackTrace();return null;}}
}

BeanUtils简化数据封装

package cn.liujinhui.web.servlet;import cn.liujinhui.dao.UserDao;
import cn.liujinhui.domain.User;
import org.apache.commons.beanutils.BeanUtils;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.设置编码req.setCharacterEncoding("utf-8");//2.获取请求参数/*String username = req.getParameter("username");String password = req.getParameter("password");//3.封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);*///2.获取所有请求参数Map<String, String[]> map = req.getParameterMap();//3.创建User对象User loginUser = new User();//3.2使用BeanU体力上封装try {BeanUtils.populate(loginUser,map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//4.调用UserDao的login方法UserDao userDao = new UserDao();try {User user = userDao.login(loginUser);//5.判断uswrif(user==null){//登录失败req.getRequestDispatcher("/failServlet").forward(req,resp);}else{//登录成功//存储数据req.setAttribute("user",user);req.getRequestDispatcher("/successServlet").forward(req,resp);}} catch (ServletException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}
}

Day15 Response

HTTP响应状态码:1-服务器未接收完成,2-成功(200),3-重定向、访问缓存,4-客户端错误,5-服务器错误

response(代表客户端)可以实现重定向(和转发都是实现资源跳转的方式)

package cn.liujinhui.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*** 重定向*/
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//访问/responseDemo1,会自动跳转到/responseDemo2资源System.out.println("demo1...");//1.设置状态码为302/*response.setStatus(302);//2.设置响应头locationresponse.setHeader("location","/day15/responseDemo2");*/request.setAttribute("msg","attribute");//更简单的重定向方法//void sendRedirect(String location)response.sendRedirect("/day15/responseDemo2");//客户端发出}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

请求转发forward重定向redirect区别:转发由服务器发出,无需加项目虚拟目录

服务器输出字符到浏览器,通过字符输出流并设置其编码方式

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

sos.write("你好".getBytes("utf-8"));

通过画笔对象(BufferedImage.getGraphics();//画笔对象)和servlet实现输出验证码到浏览器(4个随机数+10条线)

前台可以修改请求连接加独一无二的时间戳new Date().getTime();

ServletContext代表整个web应用,与服务器通信,可以通过request对象或httpservletRequest对象获取this.getServletContext()

功能:获取文件的MIME类型-getMimeType(String file)  ,实现数据共享,获取服务器真实路径context.getRealPath("WEB-INF/c.txt");

案例:点击超链接,实现图片下载

package cn.liujinhui.web.download;import cn.liujinhui.web.utils.DownLoadUtils;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取请求参数,文件名称String filename = request.getParameter("filename");System.out.println(filename);//2.使用字节输入流加载文件进内存//2.1找到文件服务器路径ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/image/" + filename);System.out.println(realPath);//2.2用字节流关联FileInputStream fis = new FileInputStream(realPath);//3.设置Response的响应头//3.1设置响应头类型:content-typeString mimeType = servletContext.getMimeType(filename);//获取文件的mime类型response.setHeader("content-type",mimeType);//3.2设置响应头打开方式content-disposition//解决中文文件名问题//1.获取user-agent请求头String agent=request.getHeader("user-agent");//2.使用工具类方法编码文件名即可filename = DownLoadUtils.getFileName(agent, filename);response.setHeader("content-disposition","attachment;filename="+filename);//4.将输入流的数据写出到输出流中ServletOutputStream sos = response.getOutputStream();byte[] buff=new byte[1024 * 8];int len=0;while((len=fis.read(buff))!=-1){sos.write(buff,0,len);}fis.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

前台

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>download</title>
</head>
<body><a href="/day15/image/1.jpg">图片1</a><a href="/day15/image/1.avi">视频</a><hr><a href="/day15/downloadServlet?filename=九尾.jpg">图片1</a><a href="/day15/downloadServlet?filename=1.avi">视频</a>
</body>
</html>

Day16 Cookie&Session、JSP

会话:客户端与服务器进行资源访问交互,用于一次会话内的多次请求进行数据共享

客户端会话:Cookie,服务器端:Session

Cookie:添加response.addCookie(Cookie),获取request.getCookies()

默认关闭浏览器销毁cookie,可以设置生命周期进行持久化存储setMaxAge(int seconds)

设置cookie范围setPath(String path):设置cookie获取的范围

案例:记住上次访问时间

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_date = sdf.format(date);System.out.println("编码前:"+str_date);//编码前的数据//URL编码str_date=URLEncoder.encode(str_date,"utf-8");System.out.println("编码后:"+str_date);//编码后的数据Cookie cookie = new Cookie("lastTime", str_date);cookie.setValue(str_date);//设置cookie的存活时间cookie.setMaxAge(60 * 60 * 24 * 30);//一个月response.addCookie(cookie);response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");

Java Server Pages:服务器端页面

原理:转换为java文件并编译成字节码文件

<% 代码 %>service的方法,<%! 代码 %>:成员变量,<=% 代码 %>:输出的变量,<%@ page import="java.net.URLEncoder" %>导包

jsp的内置对象:out-字符输出流对象

HttpSession保存数据:request.getSession();

tomcat通过session的序列化,在关闭服务器前将数据钝化到硬盘.ser,启动后tomcat自动读取ser文件反序列化/活化为内存中的session对象

默认失效时间30分钟,可以修改tomcat配置

案例:验证码存入session,servlet判断是否与输入一致

JavaEE Day17 JSP&MVC开发模式&EL&STL

JSP指令:导入资源文件  <%@ page contentType="text/html;charset=UTF-8" language="java" %>

常见指令:page(import、contentType、errorPage、isErrorPage)、include、taglib

注释:html注释--<!-- -->,jsp注释--<%-- --%>(F12看不到)

内置对象:pageContext、request、session、response、application、page、out、configure、exception

MVC目的:实现MC代码分离,使一个程序有不同的表现形式,便于实现代码重用

EL,Expression Language  表达式语言,用于简化jsp页面中代码的编写,如${表达式}

jsp默认支持,可以在page中设置属性isELIgnored,或在表达式前加\,如\${3 > 4}

使用:

  • 运算-判空${(not) empty str},/-div,%-mod,&&-and,||-or两种均可
  • 获取值:${域名称.键名},如${request.zhangsan}
  • 获取对象、list集合、map集合的值:${域名称.键名.属性名}

JSTL,Java Server Pages Tag Library---Apache提供的JSP标准标签库

需要导入标签库:taglib指令---<$@ taglib prefix = "c" uri=""%>

常用标签

  • 有<c:if test=${not empty list}>无else
  • <c:choose>,相当于switch,内部是<c:when test="">和<c:otherwise>
  • <c:forEach>可以相当于传统for循环或forEach

案例:jstl+el将集合数据显示

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>test</title>
</head>
<body>
<%List list = new ArrayList();list.add(new User("张三",23,new Date()));list.add(new User("李四",24,new Date()));list.add(new User("王五",25,new Date()));request.setAttribute("list",list);
%>
<table border="1" width="500" align="center"><tr><th>编号</th><th>姓名</th><th>年龄</th><th>生日</th></tr><%--数据行--%><c:forEach items="${list}" var="user" varStatus="s"><c:if test="${s.count mod 2 == 0}"><tr bgcolor="red"><td>${s.count}</td><td>${user.name}</td><td>${user.age}</td><td>${user.birStr}</td></tr></c:if><c:if test="${s.count mod 2 != 0}"><tr bgcolor="green"><td>${s.count}</td><td>${user.name}</td><td>${user.age}</td><td>${user.birStr}</td></tr></c:if></c:forEach>
</table>
</body>
</html>

五层架构:表示层、业务逻辑层(组合dao的方法完成复杂功能)、数据访问层(Mybatis)

案例:用户信息列表展示

使用面向接口的编程方式,类有缺陷只需要修改实现类,提高可扩展性和可维护性

JavaEE Day18 综合练习

Bootstrap中文网添加:内联表单按钮、分页组件、复选框

登录时点击验证码刷新,每次点击更新请求连接加时间戳

使用JDBCTemplate

private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);

点击按钮实现删除

    <script>function deleteUser(id) {//用户安全提升if (confirm("您确定要删除吗?")){//访问路径location.href = "${pageContext.request.contextPath}/delUserServlet?id="+id;}}</script><c:forEach items="${users}" var="user" varStatus="s"><tr><td><input type="checkbox"></td><td>${s.count}</td><td>${user.name}</td><td>${user.gender}</td><td>${user.age}</td><td>${user.address}</td><td>${user.qq}</td><td>${user.email}</td><td><a class="btn btn-default btn-sm" href="update.html">修改</a>&nbsp;<a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td></tr></c:forEach>

重定向跳转,需要加虚拟目录,由浏览器发出response.sendRedirect(request.getContextPath()+"/userListServlet");

自定义PageBean实现分页查询,使用JSTL表达式判断页数显示按钮

使用StringBuilder为sql语句添加条件

JavaEE Day19 Filter&Listener

过滤器:实现Filter接口,重写doFilter(ServletRequest req, ServletResponse resp, FilterChain chain),执行代码、拦截(chain.doFilter(req, resp);)、执行放行后的代码

可以使用xml(<dispatcher></dispatcher>)或注解配置

配置拦截路径及拦截方式@WebFilter(value = "/user/*.jsp",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})enum枚举

过滤器链执行顺序:注解按字典序,xml按<filter-mapping>定义顺序

案例:登录验证,验证请求路径,登录了/请求路径中包括登录(想登录 )放行(执行chain.doFilter()即可),否则跳转到登录页面并提示未登录

package cn.itcast.web.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** 完成登录验证的过滤器*/
@WebFilter("/*")
public class LoginFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//0.强制转换,向下转型HttpServletRequest request = (HttpServletRequest)req;//1.获取资源的请求路径URL和URI※String uri = request.getRequestURI();//2.判断是否包含登录相关的资源路径//注意排除掉css、js、图片、验证码等资源if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/")|| uri.contains("/js/")|| uri.contains("/checkCodeServlet")|| uri.contains("/fonts/")){//包含,证明用户就是想登录,放行chain.doFilter(req, resp);}else {//不包含,验证用户是否登录//3.从session中获取userObject user = request.getSession().getAttribute("user");if(user != null){chain.doFilter(req, resp);}else{//没有登录,跳转登录页面request.setAttribute("login_msg","您尚未登录,请登录");request.getRequestDispatcher("/login.jsp").forward(request,resp);}}//chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {}
}

案例:敏感词汇过滤,使用动态代理对象,代理对象 = Proxy.newProxyInstance();

package cn.itcast.web.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;/*** 敏感词汇过滤器*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//req.setCharacterEncoding("gbk");//1.创建代理对象,增强getParameter方法ServletRequest proxy_req = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//增强getParameter方法//判断是否是该方法if (method.getName().equals("getParameter")){//增强返回值//获取返回值String value = (String)method.invoke(req,args);if (value != null){for (String str : list) {if (value.contains(str)){value = value.replaceAll(str,"***");}}}return value;}//判断方法名是否是getParameterMap//判断方法名是否是getParameterValue//上述两个方法都能获取参数的值return method.invoke(req,args);}});//2.放行chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<String>();public void init(FilterConfig config) throws ServletException {try{//0.获取文件的真实路径,加载文件ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");//2.读取文件BufferedReader br = new BufferedReader(new FileReader(realPath));//3.将文件的每一行数据添加到list中String line = null;while((line = br.readLine()) != null){list.add(line);}br.close();System.out.println(list);}catch (Exception e){e.printStackTrace();}  }
}

Listener监听器,是web三大组件(Servlet,Filter,Listener)之一

注册监听:将事件、事件源、监听器ServletContextListener绑定在一起,当事件源上该发生某个事件后,执行监听器代码

需要给类名上加注解@WebListener

@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//通常用于加载资源文件//1.获取servletContextEvent对象ServletContext servletContext = servletContextEvent.getServletContext();//2.加载资源文件String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");//配置文件中的路径//3.获取真实路径String realPath = servletContext.getRealPath(contextConfigLocation);//4.加载进内存try{FileInputStream fis = new FileInputStream(realPath);}catch (Exception r){r.printStackTrace();}System.out.println("ServletContext对象被创建了");}

JavaEE Day20 JQuery基础

数组:$(js对象),入口函数$(function () {}),$(function () {alert("123");})

样式控制:$("#div1").css("background-color","red");

选择器:标签选择器、#id选择器、.类选择器、并集选择器

表单过滤选择器: :enabled、:disabled、 :checked、 :selected,如$("input[type='text']:disabled").val("aaa")

DOM操作:html()设置标签体所有内容,text()获取纯文本内容、val()获取元素value值

<script>$(function () {// 获取myinput 的value值var value = $("#myinput").val();alert(value);// 设置myinput 的value值value = $("#myinput").val("李四");// 获取mydiv的标签体内容var html = $("#mydiv").html();alert(html);// 设置mydiv的标签体内容html = $("#mydiv").html("<p>aaa</p>");// 获取mydiv文本内容var text = $("#mydiv").text();alert(text);//设置mydiv文本内容text = $("#mydiv").text("bbbb");});</script>

属性操作:attr()自定义属性,prop()通用属性,removeXXX("")

class操作:addClass、removeClass、toggleClass(切换)

【课程复习】Java Web、框架及项目简单回顾相关推荐

  1. 常用的Java Web框架简介

    Web框架是人们在使用某种语言编写Web应用服务端时关于架构的最佳实践. 有些Web框架是从实际的Web项目抽取出来的,也就是说,做一个具体的应用项目时,采取的架构比较理想,就把这部分和领域无关,而仅 ...

  2. Java 三大框架集成项目结构

    用MyEclipse开发的Java 三大框架集成项目,典型结构如下. 一 展开项目名称,首先是src文件夹:存放实现业务功能的java源文件*.java: struts2的action代码文件存放在a ...

  3. python搭建django框架,Python之Web框架Django项目搭建全过程

    Python之Web框架Django项目搭建全过程 IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 注:可通过pip fre ...

  4. Java web框架

    Java web框架综述 Java Web设计框架:Web应用的Java框架综述 特金德·辛格博士,助理教授, 旁遮普巴廷达Baba Farid学院计算机科学系(印度) 摘要:在本文中,我将Web设计 ...

  5. 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline

    使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline 一.项目简 ...

  6. 大学生课程设计 ------ Java Web课程设计(学生成绩管理系统01)

    大学生课程设计 ------ Java Web课程设计(学生成绩管理系统01) Java Web课程设计(代码+课程报告) 课程作业效果如下: 学生1:后台实现.数据库设计.前端后台整合 学生2:前端 ...

  7. 大学生课程设计 ------ Java Web课程设计(图书馆管理系统02)

    大学生课程设计 ------ Java Web课程设计(图书馆管理系统02) Java Web课程设计(代码+课程报告) 项目分工情况(每个人完成那些功能或任务) 同学A:数据库设计,后台实现,前端与 ...

  8. java web框架struts_Struts框架在Web开发中的应用

    <Struts框架在Web开发中的应用>由会员分享,可在线阅读,更多相关<Struts框架在Web开发中的应用(29页珍藏版)>请在人人文库网上搜索. 1.Struts,框架在 ...

  9. 轻量级 Java Web 框架技术选型

    2019独角兽企业重金招聘Python工程师标准>>> 本文是<轻量级 Java Web 框架架构设计>的系列博文. 前面已对该 Java Web 框架做了一些简要描述, ...

最新文章

  1. Linux下三大最佳的开源视频播放器
  2. 【Python基础】字符编码ASCII-GBK-Unicode-UTF-8之间的关系
  3. 趣说游戏AI开发:曼哈顿街角的A*算法
  4. ASP.NET Core快速入门(第2章:配置管理)--学习笔记
  5. P5021-赛道修建【平衡树,贪心,二分答案】
  6. Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)
  7. photoshop切图
  8. 计算机竞赛湖北有哪些,我校29名学生在全国大学生数学竞赛湖北赛区获奖
  9. github issue 搜索_回顾 2020 年 GitHub 的大事件,你知道多少?
  10. Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
  11. Python——如何屏蔽函数内部的print输出
  12. java steam的缓冲区_SSM框架完结篇 SpringMVC与Steam前后台功能模块开发
  13. 复杂网络-小世界网络WS模型
  14. python登录脚本_python实现的登录和操作开心网脚本分享
  15. B站傅希鸣-ElasticSearch学习笔记(ES 入门)
  16. PetaLiunx配置时sourcing bitbake报错解决方法
  17. 多源异构网络安全关联分析
  18. weblogic与oracle断开,菜鸟经验:oracle与weblogic自动启动与停止
  19. 垃圾邮件、欺骗和网络钓鱼,如何防止电子邮件安全意识的威胁
  20. 北京bgp机房和普通机房的区别

热门文章

  1. SkyWalking Agent数据采集和上报原理浅析
  2. 小程序点击多个指定地方都能关闭弹框
  3. selenium+python自动化(完整脚本一)
  4. 2019网易《Face-to-Parameter Translation for Game Character Auto-Creation》论文解析
  5. CF 229C Triangles
  6. 打印机使用的驱动语言
  7. 台式机安装EXSI,通过官方方式定制安装包
  8. windows2012r2文件服务器部署,Windows server 2012部署和配置群集文件服务器
  9. 在剧里跟“刘亦菲”学营销:地推撬动“社交播传”
  10. 【Jupyter Notebook】在jupyter中使用数学公式