导图社区 java web
Java Web,是用Java技术来解决相关web互联网领域的技术栈。web包括:web服务端和web客户端两部分。Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP、第三方框架等等。希望对你有帮助,欢迎大家学习下载!
编辑于2019-01-02 11:45:01javaweb
什么是B/S
Browser Server 浏览器 服务器程序 简称BS 浏览器通过 http 协议和服务器进行交互 浏览器向服务器发送 http 请求 服务器给浏览器http响应 这个响应中 都是html 数据
状态管理
为什么要有状态管理
因为 http 协议是无状态的 当请求响应之后这个请求就和服务器之间断开连接了,上一次请求 和以后的数据变量就没关系了。但是有时要获取上一次请求的数据状态 比如 购物 购买商品 时需要之前上一次 以及前几次购买的商品数据。
状态管理技术的实现方式
基于客户端的状态的管理技术
Cookie
原理
当浏览器 请求服务器上一个服务器时,服务器会创建好一个Cookie 对象 然后以setCookie 消息头的方式传递给浏览器。当浏览器再次请求服务器上服务时 会携带这个Cookie对象 到服务端。服务端就可以获知上一次的数据状态。
如何实现?
创建一个Cookie对象 Cookie cookie=new Cookie("key","value");
概要
如何写给客户端 response.addCookie(cookie);
如何获取请求中对应的Cookie Cookie [] cookies =request.getCookies();
概要
获取Cookie的名字和值 getName() getValue() 设置值 setValue("字符串值")
Cookie的生命期问题
默认和浏览器生命期相同 关闭浏览器则消失 值是 -1
setMaxAge(int seconds); (秒)
Cookie 到期之后 浏览器就不再携带 (如何设置三个月的生命期呢? setMaxAge(60*60*24*93);) 把生命期设置成 0 代表立即删除 Cookie
Cookie 的 路径问题
Cookie 默认所在的路径 是servlet 所在的路径。
Cookie 携带的规则是 会携带本路径下的Cookie 以及本路径对应的父路径下的Cookie
可以通过 setPath("/路径") 来修改Cookie 默认的路径
如:setPath("/servlet-day04") 则代表Cookie 放入项目下 这个项目的所有针对这个项目请求都将携带这个Cookie.
如果 把path 写成 / 代表什么意思? 代表针对所有的请求
基于服务端的状态管理技术
Session
Http 协议的构成
http 请求的构成
请求行 request line 请求的方式 请求的路径 协议/版本 请求头 request header key:value 把客户端的信息 传递给服务器 请求体 request body 携带请求参数
http 响应的构成
响应行 request line 协议 状态码 状态信息 响应头 request header key:value 把服务端的信息 传递给客户端 如 响应的格式和编码 响应体 request body 携带响应的html 数据
Tomcat
tomcat 的目录构成
bin binary 二进制的指令存放位置 conf config 配置文件的存放位置 配置文件以xml 格式体现 lib library jar包存放的位置 logs 日志存放位置 temp 临时文件存放位置 webapps 这是web项目存放的位置 web applications work tomcat 会把转换的文件放入work 加工成html的中间文件放入这里
tomcat的启动和关闭
手工启动和关闭
注意改变 端口号 和 添加 JAVA_HOME 环境变量
使用eclipse 和 tomcat 结合
注意:在server 上右键 点击 open 要修改tomcat安装项目的目录
通过URL 才能访问web服务器中的页面
http://主机:端口号/项目名/页面路径/页面名.后缀 http://localhost:9527/javaweb-day01/WebContent/login.html Union Resource Location 统一资源定位
Servlet组件
什么是Servlet?
可以提供动态的html响应
他是运行在服务器上的java类
用来完成b/s架构下 客户请求的动态响应
这个java类,需要遵守jsp/Servlet规范
如何编写一个Servlet
建立一个动态web项目,写一个java类继承HttpServlet
重写doGet方法
需要把web-inf下,配置web.xml
把项目部署到web服务器,使用url格式请求测试
创建动态web项目
Dynamic web
注意:选择tomcat运行环境和web版本
//服务器告知浏览器以html方式进行翻译和utf-8进行编码 resp.setContentType("text/html;charset=utf-8;");
// 写入浏览器,获取一个向浏览器输出对象 PrintWriter p = resp.getWriter(); p.write("<h1>" + s + "<h2>");
web.xml
<!-- 配置servlet --> <servlet> <servlet-name>一致</servlet-name> <servlet-class>包名.类名</servlet-class> </servlet> <servlet-mapping> <servlet-name>一致</servlet-name> <url-pattern>/自己写</url-pattern> </servlet-mapping>
servlet的生命周期
servlet 对象的创建
默认是第一次请求到来时 创建Servlet
(通过构造方法)
可以通过xml标记 <load-on-startup>(当其启动时加载)值大于等于0 建议写 1
servlet 对象的初始化
对象创建完成后立即 调用 void init() 完成初始化
servlet 对象的不断的服务
void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException //如果浏览器直接请求发送doget void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException //当form表单发送psot请求时,调用doPost void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException //既能处理get又能处理post请求
当发送doget请求,只有doPost方法程序会报405
解决:
@Override protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { doPost(request, response); }
servlet 对象的即将消亡
void destroy()
一旦被调用,则对象进入垃圾回收体系,现在还没有成为垃圾,调用方法才有可能成为垃圾,因为java程序员对垃圾回收权利只有建议
消亡
子主题
返回值
boolean
判断成功/失败
int
可以返回对象的id
void
没有异常成功
map<k,v>
返回结果放入<K,V>
对象
最优
localhost(127.1.1.0)
ipconfig
什么是HTTP
Hyper Text Transfer Protocol 超文本传输协议 是W3C(万维网联盟) 制定的浏览器和服务器交互的 应用层协议 主要涉及 http的请求 和 响应
get请求和post请求
GET
如何发出get请求
浏览器地址栏直接请求
超链接发出的请求
form表单method="get"
get请求的特点
请求的参数直接拼接在url后面. 拼接格式是url?key=value&key=value
由于请求参数放在url后面,所有请求携带的数据量有限,一般不超过4kb
由于请求参数直接放在url后面,所有相对的不安全
POSH
何如发出posh请求
form表单method="post"
posh请求的特点
请求的参数放在 请求体中
由于请求的参数放在请求体中: 所以请求的数据量一般不受限制
由于请求的参数放在请求体中: 相对的安全
请求参数的中文乱码问题
tomcat8:get方式没有乱码问题
tomcat8:post方式乱码问题
post提交时是以utf-8进行数据提交但,tomcat解码时默认按照ISO-8859-1进行解码
HttpServletRequest 这个类型的对象提供了对应的API对tomcat 可以设置解码的编码
request.setCharacterEncoding("utf-8")
告诉tomcat以utf-8解码
必须出现在获取参数之前
这种只针对post方式
acc_no=new String (acc_no.getbytes("iso-8859-1"),"utf-8");
先按照ISO-8859-1解码,再按照utf-8编码
这是通用的解决方式
适用于 tomcat7的get post 还有 tomcat8 post
ServletContext对象
什么是ServletContext对象?
在项目部署到web服务器时, 会为这个项目生产一个ServletContext类型的对象.这个对象可以解决多个servlet之间的信息共享和传递的问题
如何来获取?
request.getServletContext()
或在servet服务方法中 this.getServletContext()
ServletContext的API
设置数据
setAttribute("name",value)
获取数据
setAttribute("name")
删除数据
removeAttribute("name")
aaaaaaa
getRealPath("文件夹名")
获取web.xml中配置全局参数数据
getInitParameter("name");
配置全局参数:
<context-param>上下文参数
<context-name>xx
<context-value>utf-8
ServletConfig对象
什么是ServletConfig 对象?
每一个独立的servlet 对象 都有一个专门的ServletConfig 类型的对象为它服务,这个ServletConfig 类型的对象 可以 获取Servlet对象 的相关信息 和 配置信息。
如何获取?
在servet服务方法中 this.getServletContext()
ServletConfig 的API
getServletName() 获取servlet的名字
指<servlet-name>
getServletContext() 获取servlet 共享信息的对象
getInitParameter("name") 根据name 获取针对这个servlet对象的配置信息
写在<servlet>里 <init-param> <param-name> <param-value>
Servet+JDBC应用(3.1)
db.properties文件(属性文件)
.properties文件内容: #驱动地址 driverClassName=oracle.jdbc.OracleDriver #连接地址 url=jdbc:oracle:thin:@localhost:1521/XE #帐号 username=system/litao #密码 password=123456 #选填的 #初始化的连接池 连接数量 initialaSize=5 #最大的连接数量 maxActive=100 #空闲时保留的 最大连接数量 maxIdle=10 #空闲时保留的 最小连接数量 minIdle=5 #超时时间 maxWait=10000
导入3个包
编写连接池工具类
DbcpUtil
com.xdl.util包
完成一个银行账户登录的功能
在数据库中建立一张银行账户表
创建一个init.sql
/** 建立一张银行账户表 建立之前先删除 */ drop table xdl_bank_account cascade constraint; create table xdl_bank_account( id number constraint xdl_bank_account_id_pk primary key, acc_no varchar(30) constraint xdl_bank_account_acc_no_uk unique, acc_password varchar(30), acc_money number ); /** 为这张表 建立一个序列 建立之前先删除 */ drop sequence xdl_bank_account_id_seq; create sequence xdl_bank_account_id_seq; /** 插入测试数据 */ insert into xdl_bank_account values(xdl_bank_account_id_seq.nextval, 'malaoshi','17',10000000); commit;
建立一个项目 根据表建立实体类(说白就是封装)
命名格式:去掉表名下划线首字母大写 变量名与表内一致 构造,get set,tostring,序列化 implements Serializable
com.xdl.bean包
定义DAO 接口 方法的设计
命名格式:实体类后面加DAO 只做增删改查其中一件事
com.xdl.Dao
根据DAO 接口 结合 DbcpUtil 和 JDBC编程五步完成DAO实现类
命名格式:实体类+dao+数据库名+imp 连接数据库代码 1.加载驱动 2.获取连接 3.定义sql 并获取sql的预编译环境 设置参数 setXX 4. 执行SQL 处理sql的返回值 select/ 遍历结果集 5.释放资源
com.xdl.dao.imp
编写业务逻辑类 Service 封装业务方法
命名格式:实体类后面加+功能+Service 1.持有一个DAO 2.给Dao 赋值 3.封装一个业务方法(return接口.方法)
com.xdl.service
测试类
com.xdl.test
编写一个 html 页面 发出 登录请求
编写一个Servlet 用来接收用户请求参数 根据参数调用Service中的方法看是否登录成功 成功 输出 login success 否则 login failed
命名格式:实体类后面加Servlet 0.编码 1.请求参数获取 2.用service进行判断 3.把参数封装成对象 4.写入浏览器,获取一个向浏览器输出对象
com.xdl.servlet
重定向(页面跳转)
什么是重定向
当浏览器第一次请求web服务器时,web服务器给浏览器返回一个302状态码和一个url地址.当浏览器收到302状态码和后面的地址时会立即对302后的地址再次发出请求 服务器再次做出响应的过程. 302+location
response.sendRedirect("地址")
特点
本质上是浏览器上的一个行为,有两次请求,两次响应 地址栏的地址会发生改变
两次请求的 request和 response对象都是新的
重定向技术 不但可以定位项目内请求 还可以定位到项目外的请求
转发(页面跳转)
什么是转发
当浏览器向web服务器的一个servlet发出请求时,这个servlet把未完成的工作交给下一个servlet处理的过程.
获取转发器
RequestDispatcher DS=request.getRequestDispatcher("转发到的地址")
转发
ds.forward(request,response)
特点
本质上是服务器上的一个行为,有一次请求,一次响应 地址栏的地址不会发生改变
共享 request和 response对象
转发只能在项目内进行
servlet的线程安全问题
servlet线程不安全原因
同一个请求对应的servlet对象只有1个,当多个servlet 对同一个成员变量进行 写操作时,就会发生线程不安全的问题
如何解决
通过synchronized(this){}
加锁,这样线程排队
为每次方法调用分配独立的变量即可,不做成成员变量
请求参数的获取
String中请求参数获取 String data= request.getParameter("name") 根据name获取对应的请求参数 对应单值
String [] datas=request.getParameterValues("name"); 根据name 获取对应的请求参数 对应的值的数组
HttpServletRequest 获取请求头信息的API
getMethod()
获取请求方式
getServletPath();
获取servlet的请求路径 等同于url-pattiern
getContextPath()
/项目名
getServerPort()
端口号
getServerName()
主机名
getRemoteAddr()
获取远程客户端地址
getLocalAddr()
获取服务器地址
getRequestURL()
统一资源定位
http://localhost:8888/Web02/Zhuce
协议 主机 端口 项目 请求
getRequestURI()
统一资源标识
/Web02/Zhuce
项目 请求