Servelet应用开发
枚举:Enumeration
‘页面跳转提交方法基本上都是get,除了一些特殊方法用的是post’
this指代当前对象。super指代父类对象
面向对象的个数,类型,顺序不同都可以构造出来可以使用
public void pp(String... params){}//...不知个数可以随意设置个数
public static void main(String[] args){
My my = new My();
my.pp();
my.pp("adhd");
my.pp("bhvd","bhfis","uhief");//都可以调用成功
}
模板模式
反射机制:
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
ThreadLocal:
ThreadLocal是一个将在多线程中为每一个线程创建单独的变量副本的类; 当使用ThreadLocal来维护变量时, ThreadLocal会为每个线程创建单独的变量副本, 避免因多线程操作共享变量而导致的数据不一致的情况;
连接的数据库的操作流程:
1、加载驱动:
Class.forName("com.mysql.cj.jdbc.Driver")
2、获取数据库链接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
3、构建语句对象
// Statement用于静态sql语句<-PrepapredStatement支持带有参数的动态sql语句<-CallableStatement用于调用存储过程 String sql = "select * from tb_users where id>? and username like ?"; PreparedStatement ps = conn.prepareStatement(sql); // 执行ps之前必须给?赋值 ps.setLong(1, 0L); ps.setString(2, "y%");
4、提交sql语句
//ps.executeUpdate():int 用于执行修改操作,返回值表示受影响行数 ResultSet rs = ps.executeQuery(); // 用于执行查询操作
5、遍历结果集获取返回的查询数据
while (rs.next()) { Long id = rs.getLong("id");// 获取对应列的值,参数为列名称 String username = rs.getString("username"); String password = rs.getString("password"); System.out.println(id + "\t" + username + "\t" + password); }
6、关闭(正向打开,逆向关闭)
rs.close(); ps.close(); conn.close();
executeUpdate()//用于执行修改
executeQuery(); // 用于执行查询操作
工具类:
Java工具类是帮助我们做一些事情,但是不描述任何事物的类。
注意事项
:①类名要见名知意,便于对工具类的选择。
②要私有化方法,工具类只是用来使用其中的方法的类,创建对象没有意义。
③内部方法定义为静态,便于调用。
面向对象:要求高耦合低内聚
filters:过滤器,方便数据处理
StringUtils.isBlank(String str)
:判断某字符串是否为空或长度为 0 或由空白符 (whitespace) 构成
request:插入数据使用getParameter
String Username = request.getParameter("username")
web网页之间的关系
web网页之间的关系有三种,分别为请求转发、重定向和包含
请求转发
接受数据的组件将请求直接转发给另外一个组件,由另外的组件生成响应,效率比重定向高
request.getRequestDispatcher("user/add.jsp").forward(request, response);
重定向
接受数据的组件告知客户端一个新的请求地址,由客户端重新向新地址发起请求
response.sendRedirect("add.jsp")
重定向VS请求转发
-
是否共享request对象
- 请求转发共享request对象
- 重定向不共享request对象
-
是否客户端参与:
-
请求转发时客户端不参与
-
重定向需要客户端的参与。实际处理中是服务器向客户端回传了一个302的响应状态码和
location对应的新地址
-
-
如何选用
-
如果需要跳转页面和当前页共享request,则使用请求转发;如果不需要跳转页面和当前页共享request,则使用重定向
-
如果两者均可,优先考虑请求转发,因为执行效率高
-
包含
包含可以分为静态包含和动态包含两种
- 静态包含就是包含原文,然后在进行编译和执行
- 动态包含就是各自独立执行,最终包含执行结果
数据校验
UI设计中最基本的原理所有的用户数据输入都是邪恶的
,所以要求针对用户的输入必须进行合法性验证
一般数据校验分为三个层面
-
客户端数据校验:一般采用 javascript 实现,运行在客户端浏览器中。优点:不需要网络数据传输,不会对服务器造成压力;缺点:容易绕过
-
服务器端数据校验:一般采用 Java 实现的,运行在服务器端。优点:不能绕过;缺点:需要网络数据传输,会对服务器造成压力
-
业务校验:在执行具体的业务逻辑之前执行的验证,和具体的业务逻辑紧密相关
一般在具体开发中如果时限比较紧张,则经常忽略部分服务器端数据校验
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用于指定需要包含的页面文件
基本语法
<%! %>
代码声明部分,例如类中所有方法之外,可以定义方法、属性等
<%!
public String getError(HttpServletRequest req,String key){
//在<%%>中可以直接使用9大默认对象,但是在自定义方法中不能直接使用默认对象,需要传递
String res="";
Object obj=req.getAttribute("errors");
if(obj!=null && obj instanceof Map){
Map<String,String> errs=(Map<String,String>)obj;
if(errs.containsKey(key))
res=errs.get(key);
}
return res;
}
%>
<% %>
可执行的代码段,例如在一个方法中的代码部分,可以定义临时变量
<%=getError(request,"username")%> 这里需要注意在<%=和%>之间是表达式,不是语句,所以
不能出现分号
书籍商品信息表
create table tb_catalog(id bigint primary key auto_increment,name
varchar(32)) engine=innodb default charset utf8;
create table tb_book(id bigint primary key auto_increment,title varchar(64)
not null,catalog_id bigint not null,foreign key(catalog_id) references
tb_catalog(id) on delete cascade,unit varchar(8), price numeric(8,2) default
0.0) engine=innodb default charset utf8;
首页显示所有数据的查询语句`select b.*,c.name from tb_book b left join tb_catalog c on
b.catalog_id=c.id`
关联查询常见的有3种:
-
交叉连接:笛卡尔积,基本在具体应用种不会使用
-
select * from t1,t2
-
select * from t1 cross join t2
-
-
内连接:连接双方满足条件则双方匹配显示,否则都不显示。内连接可以分为等值和不等值两种
select * from t1,t2 where t1.t2_id=t2.id
-
外连接:外连接可以分为左外、右外和全外三种,MySQL不支持全外连接
-
左外,显示左表种的所有数据,右边表种的数据自动按照连接条件进行匹配显示,如果右表种没有对应数据,则显示为null。右外刚好相反
-
select * from tb_catalog c left join tb_book b on c.id = b.catalog_id ;
-