Java web简介
web应用程序是一种通过web访问的应用程序,web应用程序的一个最大的好处是用户很容易访问应用程序。用户只需要啊有浏览器即可,不需要安装其他软件。
为什么要学习web应用程序?
web应用程序是目前软件开发的三大方向之一,javaEE方向需求一直很大,就是就业比较容易和稳定:
静态网页与动态网页
搭建javaweb开发环境:JDK7.0,Tomcat7.0,MyEclipse or idea
Tomcat服务器:Apache Jakarta的开源项目,JSP/Servlet容器
tomcat服务器的目录文件:
发布的项目都存储在webapps文件目录下面。
手工编写一个web程序:
测试首页:
1、打开Tomcat服务器
2、web项目存储在webapps里面,输入网址:
http://localhost8080/SGjavaweb/index.jsp
中文乱码问题汇总
1、page中设置contenType为"text/html;charset=UTF-8"
2、在page页面设置请求的文本编码设置为utf-8
web项目的虚拟路径
使用工具创建项目后通过网址访问http://localhost8080/SGjavaweb/index.jsp
虚拟路径中的SGjavaweb默认和项目名相同,但是可以修改虚拟路径,
修改Tomcat服务器默认端口
JSP基础语法
JSP简介
JSP全名为Java Server Pages ,其根本是一个简化的Servlet设计,他实现了在Java当中使用HTML标签,JSP是一种动态网页技术,标准也是JAVAEE的标准。JSP与Servlet一样,是在服务端执行的。
常用的:动态网站技术开发对比
JSP页面元素简介及page指令
JSP页面元素构成
JSP指令
JSP注释
三种注释方式:
JSP脚本
<% %> JSP的内置对象out
JSP声明
在JSP页面中定义申明变量或者方法:
方法:<%! java代码 %>
JSP表达式
在JSP页面中执行的表达式,表达式不以分号结束,可以通过表达式语句调用声明的变量和函数。
JSP的生命周期
JSP生命周期:jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理请求。如果有多个客户端同时请求JSP文件,则JSP引擎会创建多个线程,。每个客户端请求对应一个线程。以多线程方式执行可以大大降低系统的资源需求,提高系统的并发量以及相应时间,由于Servlet始终驻于内存,所以响应快。
阶段项目
分别使用表达式和脚本实现打印九九乘法表
JSP内置对象
JSP内置对象简介:JSP 内置对象是web容器创建的一组对象,不使用new关键就可以使用的内置对象。
常用的内置对象简介:
Web程序的请求响应模式
out对象
什么是缓冲区
缓冲区:Buffer,所谓缓冲区就是内存中用来保存临时数据。
out对象:out对象是JspWriter类的实例,是想客户端输出内容的常用对象。
常用方法如下:
flush方法:
使用之前
使用后,缓冲区变大了,flush方法将其缓冲区内容输出了:
flush之后调用clear会出现异常,一旦抛出异常后面不会执行,但是在之后调用clearBuffer不会抛出异常。
表单常用的提交方式
get与post区别:
表单有两种提交方式:get与post
post方法:安全性高,数据不会出现在URL中
get方法:数据会出现在URL中,容易泄露一些用户的个人隐私。
request对象
客户端请求的信息被封装到request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用的方法如下:
request对象的生命周期:
创建表单
request请求页面
通过URL传参
传递中文参数可能会出现乱码问题:
解决办法,在Tomcat的conf文件下,有一个server.xml文件,找到其中有一个connecter标签,标签最后面加上一个属性,URIEncoding=“utf-8”,测试中如果没有乱码,那么就是因为已经加上了属性。
其他request对象:
response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HTTPServletRequest类的实例。request对象具有页面作用域,即访问一个页面是,该页面内的response对象只能对这次访问有效,,其它页面的response对象对当前页面无效。常用方法如下:
请求转发与请求重定向(重点)
请求重定向:客服端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
请求转发:服务器行为,request.getRequestDispatcher().forword(req.resp);是一次请求,转发后请求对象会保存,地址栏的URL不会改变
session对象
在服务器内存中保存着不同用户的session,每一个用户对应一个session。
常用方法如下:
session的生命周期
1、通过超链接打开的新页面属于同一次对话。
2、只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问统一项目资源时,属于同一次会话。
3、本次会话所有的页面都关闭的情况下(包括其他网站的页面,最好关闭浏览器),再重新访问某个JSP或Servlet时会创建新的会话。
4、在不同的浏览器访问同一个项目资源属于不同的会话。
总结:
session销毁方法:
1、调用invalidata()方法来销毁对象。
2、设置session超时
调用setMaxInactiveInterval(时间);//单位是秒
或者在web.xml配置。
application对象
application对象
application对象的方法:
application对象实现了用户间的数据的共享,可以存放全局变量。
application开始与服务器的启动,终止于服务器的关闭。
在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
page对象
当前page页面对象的描述:
pageContext对象
包含页面操作:
Config对象
Exception对象
exception对象
用户登录案例
实现用户登录的小例子:
登录页面:
业务页面:使用内部转发和重定向
登录成功页面:
失败页面:
session为空的处理办法:
Javabean
Javabean简介
Javabeans就是符合某种特定的规范的java类。使用javabenans的好处是解决代码重复编写,减少代码冗余,功能区分明确,调高了代码的维护性。
符合Javabean设计原则的类:
JSP的动作
JSP动作元素,动作元素为请求处理阶段提供信息,动作元素遵循XML的语法,有一个包含元素名的开始标签,可以有属性、可以选的内容,与开始标签匹配的结束标签。
如何使用javabeans
1、像使用普通java类一样,创建Javabean实例
首先创建java.class文件User.java
然后创建一个jsp文件:
在jsp页面中通常使用jsp动作标签使用Javabean:useBeans、setProperty、getProperty
使用useBean动作创建Javabean的实例
没有初始化,引用类型都是null,需要使用setproperty,来赋值;
jsp:setProperty
作用:给已经实例化的Javabean对象的属性进行赋值,一共有四种形式。
第一种:
创建一个表单
然后编写业务代码:跟表单相关联
第二种:跟表单关联,但是是自动指定,属性来进行匹配
第三种:手工设置,将value值赋值给属性,而不是通过表单
第四种:通过URL传参数来给属性赋值
jsp:getProperty:作用指定Javabean对象的属性值。
<jsp:getProperty name=“JavaBean实例名” property=“属性名”>
通过使用getProperty来获取用户名和密码
Javabean的四个作用域范围
说明:使用useBeans的scope属性可以用来指定Javabean的作用范围
request范围需要指定请求转发,因为使用超链接的方式相当于又是一次新的请求,获取不了Javabean对象,
使用一个表单:
使用URL进行传参到dologin_getproperty.jsp中,并实例复制到javabean对象中
但是session和application范围可以使用超链接的方式,获取Javabean对象
page范围仅在当前页面有效在其他页面获取不了Javabean对象
总结:application作用于整个web应用,session作用于一个整个会话(服务开始到关闭),request在完成客户端的请求之前,该对象一直有效,page是对当前页面有效。
Model1和Moldel2:
Model1模型出现前,整个Web应用的情况:几乎全部由JSP页面处理,JSP页面接收处理客户请求,对请求处理后直接作出响应。
弊端:在界面层充斥着大量的业务逻辑的代码和数据访问层代码,Web程序的可扩展性和可维护性非常差。
Javabean的出现可以使jsp页面中使用Javabean封装的数据或者调用Javabean的业务逻辑代码,这样大大提升了程序的可维护性。
Javabean既可以封装业务逻辑功能,也可封装数据。
Model1:(javaweb开发的最早的一种模式)
项目实战:使用JSP+Javabean完成用户登录功能
JSP状态管理
http协议的无状态性
无状态是指,当浏览器发送请求给服务器的时候,服务器响应客服端的请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器。
简单说就是服务器不会去记得你,所以就是无状态协议。
Cookie概述
Cookie:中文名称为“小甜饼”,是Web服务器保存在客户端的一系列 文本信息。
典型应用一:判定注册用户是否已经登录网站。
典型应用二:“购物车”的处理
生活中的Cookie的应用:
系统会自动记录已经浏览过的视频
记住用户名和密码实现自动登录功能
Cookie作用:
对特定对象的跟踪
保存用户网页记录与习惯
简化登录
安全风险:容易泄露用户信息
JSP页面中使用Cookie
创建Cookie对象
写入Cookie对象
读取Cookie对象
Cookie的常用方法:
JSP中创建与使用Cookie
实现记忆用户名和密码功能
问题1?:复制到文件夹中的JSP文件,在服务器上打开时候,出现404源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。但是修改一下文件又能打开。为啥?
问题2?IDEA服务器热部署详解(On Update action/On frame deactivation)
一般服务器(比如tomcat,jboss等)启动以后,我们还需要进一步修改java代码,或者是jsp代码。一般来说,改完重启以后才会生效。但如果配置了服务器的热部署,就可以改完代码后立即生效,而不是重启服务器再生效。这样就会节省大量时间!
On Update action : 顾名思义,当代码改变的时候,需要IDEA为你做什么;
Update resources :如果发现有更新,而且更新的是资源文件(.jsp,.xml等,不包括java文件),就会立刻生效
Update classes and resources : 如果发现有更新,这个是同时包含java文件和资源文件的,就会立刻生效
这里需要注意一下:在运行模式下,修改java文件时不会立刻生效的;而debug模式下,修改java文件时可以立刻生效的。当然,两种运行模式下,修改resources资源文件都是可以立刻生效的。
-Redploy : 重新部署,只是把原来的war删掉,不重启服务器
-Restart : 重启服务器
On Frame deactivation : 当失去焦点(比如你最小化了IDEA窗口),需要IDEA为你做什么。
Do nothing : 不做任何事 (一般推荐这个,因为失去焦点的几率太大)
Update resources : 失去焦点后,修改的resources文件都会立刻生效
Update classes and resources : 失去焦点后,修改的java ,resources文件都会立刻生效
Session与Cookie对比:
JSP指令与动作元素
include指令
语法:<%@ include file=“URL”%>
include指令的意思就是页面包含的意思
include动作
include指令和include动作比较
forward动作(请求转发)
param动作(传参数)
语法:
<jsp:param name=“参数名” value=“参数值”>
常常与<jsp:forward>一起使用,作为其的子标签。
案例:商品浏览记录的实现
项目总体介绍:(采用Model1(jsp+Javabean)实现)
实现DBHelper类
创建实体类
创建业务逻辑类(DAO)
创建页面层
项目原型:
DBHelper类设计:
并且添加:mysql连接到WEB_INF下的lib文件夹
实现DBHelper类型
String driver = “com.mysql.cj.jdbc.Driver”;//数据库驱动
//连接数据库URL地址
String url = “jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC”
一般出错可能是没有加入时区和数据库驱动写错了。
public class DBHelper {
//连接数据库的驱动
private static final String driver = “com.mysql.cj.jdbc.Driver”;//数据库驱动
//连接数据库的URL地址
private static String url=“jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC”;
private static String username = “root”;//数据库的用户名
private static String password = “admin”;//数据库的密码
private static Connection conn = null;
//加载驱动(静态代码块负责加载驱动)
static {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//单例模式返回数据库连接对象
public static Connection getConn() throws Exception{
if(conn==null){
conn = DriverManager.getConnection(url,username,password);
return conn;
}
return conn;
}
public static void main(String[] args) {
try {
Connection conn = DBHelper.getConn();
if (conn!=null){
System.out.println("数据库连接正常");
}else {
System.out.println("数据库连接异常");
}
}catch (Exception ex){
ex.printStackTrace();
}
}
}
商品实体类设计
在shopping数据库下建表:
SET FOREIGN_KEY_CHECKS=0;
– Table structure for items
DROP TABLE IF EXISTS items
;
CREATE TABLE items
(
id
int(11) NOT NULL auto_increment,
name
varchar(50) default NULL,
city
varchar(50) default NULL,
price
int(11) default NULL,
number
int(11) default NULL,
picture
varchar(500) default NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
– Records of items
INSERT INTO items
VALUES (‘1’, ‘沃特篮球鞋’, ‘佛山’, ‘180’, ‘500’, ‘001.jpg’);
INSERT INTO items
VALUES (‘2’, ‘安踏运动鞋’, ‘福州’, ‘120’, ‘800’, ‘002.jpg’);
INSERT INTO items
VALUES (‘3’, ‘耐克运动鞋’, ‘广州’, ‘500’, ‘1000’, ‘003.jpg’);
INSERT INTO items
VALUES (‘4’, ‘阿迪达斯T血衫’, ‘上海’, ‘388’, ‘600’, ‘004.jpg’);
INSERT INTO items
VALUES (‘5’, ‘李宁文化衫’, ‘广州’, ‘180’, ‘900’, ‘005.jpg’);
INSERT INTO items
VALUES (‘6’, ‘小米3’, ‘北京’, ‘1999’, ‘3000’, ‘006.jpg’);
INSERT INTO items
VALUES (‘7’, ‘小米2S’, ‘北京’, ‘1299’, ‘1000’, ‘007.jpg’);
INSERT INTO items
VALUES (‘8’, ‘thinkpad笔记本’, ‘北京’, ‘6999’, ‘500’, ‘008.jpg’);
INSERT INTO items
VALUES (‘9’, ‘dell笔记本’, ‘北京’, ‘3999’, ‘500’, ‘009.jpg’);
INSERT INTO items
VALUES (‘10’, ‘ipad5’, ‘北京’, ‘5999’, ‘500’, ‘010.jpg’);
如何把浏览记录保存在cookie中?