JavaWeb_02_进阶

一、基本概念

在学习了最基础的HelloJavaweb项目后,我们需要进一步学习更强大的功能,从而满足一个网站的最基本的功能需求

二、Maven工具

作用:JavaWeb开发中必须要使用到大量的jar包,Maven可以实现通过项目依赖,自动下载、导入jar包,以及此jar包下所有依赖的jar包

核心思想:依赖大于配置

问题:配置文件有时候无法被导出

三、Servlet

  • 什么是Servlet
    开发动态Web的一门技术
    Servlet 是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
  • Servlet处理请求图解
    在这里插入图片描述
  • POST、GET

请求行,post和get达成的效果一致,不过在请求的过程中有些许不同:
doGet:请求携带的参数较小,但是比较高效;会在URL地址栏中显示数据内容,不安全
doPost:携带的参数无限制,因此低效;不会在URL中显示数据内容,安全

  • 响应状态码

404:找不到目标资源
5**:服务器代码错误 —— 502:网关错误
200:请求状态成功
3**:请求重定向

四、ServletContext对象

web容器启动时,为每一个web程序创建一个ServletContext对象,作用在所有servlet 之上,代表当前;
ServletContext
作用:

  1. 数据共享

可做为一个容器,servlet1存入数据,servlet2取出数据,达成数据共享
若未存入,取出值为null

//存入一个变量名为test的String类型值
this.getServletContet().setArrtibute("test","data");
//取出
String str = this.getServletContet().getArrtibute("test");
  1. 请求转发
    等同于request请求转发
this.getServletContext().getRequestDispatcher("/get").forward(req,resp);
  1. 获取资源(读取文件)
//读取resources目录资源
//InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//读取Java目录资源——会遇到资源导入问题
//InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/xawl/servlet/ab.properties");
	//用此方法解决中文乱码问题
	//将资源转换为流
	BufferedInputStream in =new BufferedInputStream(
                    this.getServletContext().getResourceAsStream(
                    "/WEB-INF/classes/com/xawl/servlet/ab.properties"));
	//新建Properties对象
	Properties prop = new Properties();
	//Properties对象读取流
	prop.load(new InputStreamReader(in,"UTF-8"));
	//获取资源文件值(根据键,获取值)
	String name =prop.getProperty("name");
	String age = prop.getProperty("age");
  1. 获取初始化参数
<!--xml设置初始化值-->
<context-param>
	<param-name>name</param-name>
	<param-value>value</param-value>
</context-param>
//Java获取初始化值
String str = this.getServletContet().getInitParmeter("name");

五、Request、Response对象

Web服务器收到Http请求时,针对此请求,分别创建对象:

  • 响应:HttpServletResponse
    1. 用于给客户端响应信息,给浏览器发送数据的方法
    2. 负责向浏览器发送响应头
    3. 响应状态码
    4. 实现重定向(url发生变化)
//重定向
	response.sendRedirect("/path");
  • 请求:HttpServletResquest
    代表客户端的所有请求
  1. 获取前端传递的参数
<form action="{pageContext.request.contextPath}/path" method="get">
//获取前端name变量的值
request.getParameter("name");
//获取多选框的值
request.getParameterValues("names");
  1. 请求转发
 //请求转发
 	request.getRequestDispatcher("/test.jsp").forward(req,resp);

六、Cookie、Session

会话
用户打开浏览器——操作——关闭浏览器:此过程为一个会话
网站如何知道你来的次数,如何知道下一次来的还是你?——确定身份
①服务器给客户端一个信件,每次访问带着信件:Cookie
②服务器登记信息,下次来主动匹配:Session

  • Cookie:客户端技术,默认有效期存在于一次会话中,浏览器关闭,Cookie被删除(部分浏览器可以恢复会话)
    1. 服务器给客户端发送Cookie信息,可设置有效期
    2. 发送给客户端
    3. 服务器获取http请求的Cookie,若不存在,重复1、2步骤
    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");
	//获取Cookie
	Cookie cookies[] = req.getCookies();
	//判断示符携带cookie
	if(cookies!=null) {
		//cookie存在多个,遍历匹配
	    for (Cookie cookie : cookies) {
	        if (cookie.getName().equals("lastTime")) {
	            //获取cookie value值,编码对应解码
	            String str = URLDecoder.decode(cookie.getValue(), "utf-8");
	            resp.getWriter().println("欢迎访问本网站,上次访问时间为:" + str);
	        }
	    }
	}
	else{
	    writer.println("第一次访问本网站");
	}
	Date date = new Date();
	SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
	String time = simple.format(date);
	//编码,否贼会报错
	Cookie cookie = new Cookie("lastTime", URLEncoder.encode(time,"utf-8"));
	//发送给客户端的Cookie,打包发送
	//设置有效期
	cookie.setMaxAge(24*60*60);
	resp.addCookie(cookie);
    }
  • Session:服务器技术,一个Session独占一个浏览器,不关闭服务器,即存在
  1. 获取Session
Object str = req.getSession().getAttribute("str");
  1. 使用其存值
//可存入对象
req.getSession().setAttribute("message",date);
  1. 设置有效期和手动注销
<!--  设置Seession的有效时间-->
  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>
//移除Session
    HttpSession session = req.getSession();
    req.removeAttribute("message");
    session.invalidate();
  • Session和Cookie总结

Cookie将数据置于浏览器保存
Session将数据置于服务器保存

七、JSP

可嵌入Java代码、HTML代码
原理:Tomcat内有一个index.jsp.java,被映射至工作目录,其本质上还是Servlet,经转换后转换为Java类

  1. 内置对象

这四个用于存、取数据,作用域从小到大
pageContext 页面内有效
request 一次请求有效,通过请求转发可携带此数据
session 一次会话有效,从浏览器打开到关闭
application 所有servlet之上,服务器有效,从服务器打开到关闭
.
config ServletConfig服务器配置,可得到初始化参数
out 输出流
page 当前页
response 服务器给用户响应信息
exception 异常

  1. 基础语法

<% java %> 脚本片段——可用于内置Java语句
<%= java %> 变量表达式——程序输出到客户端
<%! java %> 声明 ——此处代码会被编译到Java类中,其他默认处于jspservoce()方法中
<%@ %>指令
例:<%@ page errorpage=""%> 指定跳转
<%@ include file=“test.jsp”%>引入某个页面,合并为一个
<jsp:include page=""> 拼接页面,本质为多个

  1. JSPL标签、EL表达式
    此处省略,可查资料

八、MVC三层架构

三层:Model:模型层 View:视图层 Controller:控制层
在这里插入图片描述View:展示数据,提供链接,发起请求
Model:业务逻辑层(service)+数据持久层(dao)
Controller:接受用户请求,交付给业务层,并处理业务层代码,控制视图跳转

九、过滤器、监听器

  1. 过滤器

可以实现过滤网站的数据
使用:编写过滤类,实现Filter接口
重写init()、doFilter()、destroy()方法
配置xml,确定过滤范围

//过滤格式,防止乱码
public class FilterDemo implements Filter {
    //过滤器初始化
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }
    //过滤器运行时的触发动作
    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("过滤器启动");
        //谨记,一定得写,使过滤器继续执行下去,不然会卡住
        chain.doFilter(request,response);
    }
    //过滤器关闭时触发时的动作
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}
<!--  配置过滤器-->
  <filter>
    <filter-name>filter</filter-name>
    <filter-class>com.dcits.easys.filter.FilterDemo</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filter</filter-name>
    <!--过滤器生效在/f文件夹下所有文件中-->
    <url-pattern>/f/*</url-pattern>
  </filter-mapping>

注解配置实现:@WebFilter("/f/*")

  1. 监听器:当发生某些事件时触发,执行预设动作
//监听器测试
public class Test implements HttpSessionListener {
    //创建Session时触发
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("新增用户");
    }
    //销毁Session时触发
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("注销用户");
    }
}
  <!--  配置监听器-->
  <listener>
    <listener-class>com.dcits.easys.listener.Test</listener-class>
  </listener>

十、JDBC

JDBC连接数据库步骤

  1. Maven导入依赖(导包)mysql
  2. 加载驱动 Class.forName(“Driver”);
  3. 连接数据库 getConnection(url,name,password);
  4. 编写SQL语句,预编译SQL:
  5. 执行SQL:
  6. 关闭连接:
    例:
public class JDBCDemo {
    public static void main(String[] args) throws SQLException {
        //配置信息  useUnicode=true&characterEncoding=utf-8 解决中文乱码
        String url = "jdbc:mysql://localhost:3306/webstore?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";
        Connection connection = null;
        //加载驱动
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch (Exception e){
            System.out.println("驱动加载失败");
        }
        try{
            //代表数据库,进行连接
            connection = DriverManager.getConnection(url, username, password);
        }
        catch (Exception e){
            System.out.println("连接失败");
        }
        //编写SQL
        String sql = "select empno from emp;";
        //预编译
        PreparedStatement pre = connection.prepareStatement(sql);
        //执行查询SQL  返回ResultSet结果集对象
        ResultSet resultSet = pre.executeQuery();
        while(resultSet.next()){
            System.out.print("empno:" + resultSet.getObject("empno"));
        }
        //关闭连接,释放资源
        resultSet.close();
        pre.close();
        connection.close();
    }
}

sql注入:

		//使用?预留位置,预编译后进行插入
        String sql = "select empno from emp where id = ? and name = ?;";
        PreparedStatement pre = connection.prepareStatement(sql);
        pre.setInt(1,"1");
        pre.setString(2,"张三");

在学习了基本的JDBC操作后,就可以实现对数据库的简单增删查改操作

总结:根据学习,后端和前端的交互无非传输数据、转发页面,后端和数据库的交互也就是CRUD(增删改查),我们着重需要编写的是业务逻辑上的代码,因此,根据所学的JavaWeb,我们可以开发出一个最基本的网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值