Servlet4

今天的学习内容:

Servlet应用开发

9大默认对象

  • config:ServletConfig用于封装当前Servlet对象的配置信息

ServletConfig是一个Servlet API中的接口,由服务器提供实现,并完成实例化操作,在第一次调用Servlet时传入

public interface ServletConfig {
    public String getServletName();  获取Servlet配置中的<servlet-name>对应的值
    public ServletContext getServletContext();  获取当前的应用上下文对象 application
    public String getInitParameter(String name);  根据参数名称获取当前servlet对象的初始化参数值。配置方法  web.xml
   <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.yan.action.HelloServlet</servlet-class>
        <init-param>
            <param-name>width</param-name>  参数名称
            <param-value>123</param-value>  对应的配置值
        </init-param>
    </servlet>

    获取配置参数的方法
        String width=this.getServletConfig().getInitParameter("width");


    public Enumeration<String> getInitParameterNames();  用于获取当前Servlet的所有的配置参数的枚举器

    Enumeration<String> ss=this.getServletConfig().getInitParameterNames();
    while(ss.hasMoreElements()) {
        String name=ss.nextElement();
        String value=this.getServletConfig().getInitParameter(name);
    }

}
  • request:HttpServletRequest接口类型,由容器负责提供实现和对象的创建,调用doXxx方法时作为参数传入,用于封装客户端的请求信息

    • getParameter(“参数名称”):String 无论是get请求还是post请求,都可以通过提交参数的名称获取到提交的数据

      • Get请求:对应的处理为Servlet中的doGet方法,请求参数位于URL地址串中,例如’http://localhost:8080/test/hello?name=zhangsan&age=12&sex=true’,由于get请求参数位于URL地址中,所以数据传输上限一般为2k
      • Post请求:对应的处理方法为Servlet中的doPost方法,请求参数位于http协议体中,在地址栏中不能看到,所以传输的数据理论上来说没有上限,但是不同的浏览器实际上是有差别的
    • getParameterNames():Enumeration 获取所有请求参数名称的枚举器

      Enumeration<String> ee=request.getParameterNames();
      while(ee.hasMoreElements()) {
              String name=ee.nextElement();
              String value=request.getParameter(name);
              System.out.println(name+"\t"+value);
      }
      
    • Map<String, String[]> map=request.getParameterMap()获取所有请求参数的名值对,需要注意的是值为String[]

    • String[] vals=request.getParameterValues("hobby");用于提交数据的一个名字对应多个值的情形下,例如checkbox复选框,选中多个值提交时

      <form action="hello">
          <input name="hobby" type="checkbox" value="1" checked="checked">篮球
          <input name="hobby" type="checkbox" value="2">足球
          <input name="hobby" type="checkbox" value="3">排球
          <input name="hobby" type="checkbox" value="4">其它
          <br/>
          <input type="submit" value="提交数据"/>
      </form>
      

      在Servlet中接受数据

      String[] vals=request.getParameterValues("hobby");
      

      注意:事实上一个名称对应一个值,也可以使用getParameterValues接受数据,只是返回的长度为1的字符串

    • request.getHeader(“Host”):String,另外有获取int类型和date类型的请求头数据的方法request.getIntHeader和request.getDateHeader,还有获取所有请求头数据的方法Enumeration<String> ee=request.getHeaderNames();

web网页之间的关系

web网页之间的关系有三种,分别为请求转发、重定向和包含

请求转发

接受数据的组件将请求直接转发给另外一个组件,由另外的组件生成响应

request.getRequestDispatcher("user/add.jsp").forward(req, resp);

重定向

接受数据的组件告知客户端一个新的请求地址,由客户端重新向新地址发起请求

包含

包含可以分为静态包含和动态包含两种

  • 静态包含就是包含原文,然后在进行编译和执行
  • 动态包含就是各自独立执行,最终包含执行结果

MVC模式

MVC模式将应用强制划分为3个部分:

  • Model模型,用于封装数据逻辑和业务逻辑,一般采用JavaBean实现
  • View视图,用于收集客户动作和显示数据,一般采用jsp+jstl实现
    • 目前新的开发方法为前后端分离开发,后端只提供一个RESTful的调用接口
  • Controller控制器,用于实现流程控制,一般采用Servlet实现

在MVC中不允许直接访问页面,所有的访问都应该经过Servlet转发

JSP: java Server Page

jsp究其本质就是Servlet,主要用于实现页面显示。主要由静态部分[html页面]+java脚本两部分构成,为了简化页面中的java编程,引入JSTL【java标准标签库】

jsp三大页面指令

<%@ page %>用于定义页面全局属性

  • language 用于定义页面中所使用的脚本语言
  • contentType用于指定页面生成的响应内容类型,使用MIME协议【多用途互联网邮件扩展,例如生成html则为text/html,生成图片image/jpeg】,浏览器可以根绝响应内容类型调用不同的处理方式处理响应内容
  • pageEncoding 用于指定当前页面所使用的编码字符集,常见的编码字符集有UTF-8、GBK等

在具体使用中contentType和pageEncoding利用默认值可以相互替代,例如contentType=*"text/html; charset=ISO-8859-1"* pageEncoding=*"ISO-8859-1"*其中的编码字符集设置只需要一个即可,一般使用contentType居多

<%@ include %>用于实现页面的静态包含

  • file用于指定需要包含的页面文件

开发目标:一个小型的应用项目,网络书店

功能:在线销售本网站的书籍

开发:使用 Servlet + JSP 开发

1、需要显示一个添加用户信息的页面

UserController --> JSP,由于页面种包含很多公共内容,所以页面需要分为多个不同的部分

为了简化Servlet编程,使用模板模式定义抽象父类,提供的功能是可以根据请求地址中的action参数决定调用目标Servlet的方法

public abstract class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 在项目中约定一个规则:添加一个额外参数action,用于表示所执行的操作
        String method = req.getParameter("action");
        if (method == null || method.trim().length() < 1)
            method = "show";
        try {
            // 使用反射机制调用method对应的方法
            Class clz = this.getClass();
            // 参数1是方法名称,后续参数采用的是不确定个数的参数,这里是需要查找的方法的参数类型列表
            Method mth = clz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);// 通过反射机制获取Class对象中的方法对象
            //执行查找到的方法,参数1为调用的方法所属于的对象,后续参数为具体传递的参数
            mth.invoke(this,req,resp);
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

    public abstract void show(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException;
}

1、页面显示一个输入数据的窗口

2、用户填充数据,并点击提交按钮

3、服务器接受用户提交的数据,并将数据存储到数据库

使用关系型数据库存储数据

数据库设计常见方法有:试凑法、规范化法和CAD法【计算机辅助设计】

  • 试凑法由开发人员按照经验创建数据库,然后在具体的应用中进一步验证和修改。质量完全依赖于开发设计人员的经验
  • 规范化法比较常见,首先根据需求创建模式,然后针对模式套用3NF,如果不满足范式要求则进行拆分操作,知道满足范式3为止。注意这里有反范式
  • 计算机辅助设计法一般常使用PowerDesigner之类的绘图工具进行设计【按照需求规制概念模型–>物理模型–>生成SQL语句】
模式: 用户(用户编号,用户名称,用户密码,真实姓名、性别,地址,邮编,电话,email)
- 要求用户名称不允许重复
- 如果账号和钱有直接或者间接的关系,针对密码还需要考虑加密处理,以避免廉政危机问题
- 不考虑特殊情况,一般性别只有男或者女,可以考虑使用boolean类型存储数据,默认为男

应用范式: 实际上数据库中有5+1级范式,平衡查询性能和数据冗余,一般要求三级范式,但是具体开发中有可能为了考虑查询性能,降低范式要求

1、MySQL数据库中常见的数据引擎有Innodb支持事务和外键:MyISAM不支持事务和外键,提高查询性能;Memory一般用于充当缓存  show engines;
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.01 sec)

2、编码字符集。如果考虑中文则可以使用utf8或者utf8mb4,注意这里不是utf-8

NF1:列不可分
NF2:不允许部分依赖PK
NF3:不允许传递依赖

一个表中只能包含一个主键,但是主键可以由多个列构成;聚簇索引
主键有2种类型:代理主键和自然主键。代理不包含任何含义,仅仅是用于实现非空唯一;自然则包含业务含义

auto_increment如果到达上限?
    会生成数据,是上一次生成的值,但是主键约束会报异常

create table if not exists tb_users(
    id bigint primary key auto_increment comment '用户编号',
    username varchar(32) not null unique,
    password varchar(32) not null,
    realname varchar(16) not null,
    sex boolean default 1,
    address varchar(64) not null,
    postcode char(6) not null,
    phone varchar(11) not null,
    email varchar(32) not null
)engine=innodb default charset utf8;

注意:在具体的应用开发中一般除了主键约束之外的其它约束一概不加---方便测试
   业务实现中进行约束检查

定义DAO:数据访问对象是JavaEE中的一种设计模式,用于实现数据访问逻辑的封装

  • 一个接口用于约束具体的调用方式
  • 一个值bean用于传递数据,具体可以参考表结构
  • 若干实现是针对不同的数据存储方式的访问逻辑实现
  • 一个工厂用于实现相同接口不同实现之间的任意切换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值