java开发:
bs原理
浏览器–应用程序服务器–数据库服务器
bs结构程序完全部署在应用程序服务器中,基于请求和响应,基于http协议。一次请求对应一次响应。
tomcat服务器–小型开源免费的应用程序服务器,默认端口号8080。学习、开发中应用tomcat服务器,项目上线应用收费的应用程序服务器weblogic….
URL格式:
http://ip地址:tomcat的端口号/项目名/访问的路径
请求的方式:
get: 显示提交、不安全、、不能直接支持中文。
表单的method属性设置为get时(默认)
用户的输入信息会在地址栏显示
输入url
点击链接
post: 隐式提交、安全、支持中文。
表单的method属性设置为post时
Servlet接口
└─GenericServlet抽象类
└─HttpServlet抽象类(基于http协议),我们所使用的servlet根基类。
ServletRequest、ServletResponse
└─HttpServletRequest、HttpServletResponse。基于http协议的请求、响应
javax.servlet Interface Servlet
All Known Implementing Classes:
GenericServlet
javax.servlet
Interface Servlet
All Known Implementing Classes: GenericServlet
javax.servlet
Interface ServletConfig
All Known Implementing Classes:
GenericServlet
javax.servlet
Interface ServletContext
javax.servlet
Interface ServletRequest
All Known Subinterfaces:
HttpServletRequest
javax.servlet
Interface ServletResponse
All Known Subinterfaces:
HttpServletResponse
javax.servlet
Class GenericServlet
java.lang.Object
└─javax.servlet.GenericServlet
All Implemented Interfaces:
java.io.Serializable, Servlet, ServletConfig
Direct Known Subclasses:
HttpServlet
javax.servlet.http
abstract Class HttpServlet
java.lang.Object
└─javax.servlet.GenericServlet
└─javax.servlet.http.HttpServlet
All Implemented Interfaces:
java.io.Serializable, Servlet, ServletConfig
javax.servlet.http
Interface HttpServletRequest
All Superinterfaces:
ServletRequest
javax.servlet.http
Interface HttpServletResponse
All Superinterfaces:
ServletResponse
javax.servlet
Interface RequestDispatcher
自定义Servlet类的创建:
路径问题:
http://localhost:8080/项目名
http://localhost:8080/
tomcat默认端口号:8080,修改tomcat的端口号:
项目调试:
web.xml: 最先被加载的配置文件
容器如何处理请求:
servlet的生命周期:
HTTP请求 → 解析请求 → 创建servlet实例 → 调用init()方法 → 调用service()方法 → 输出响应信息 → 响应 → 调用destroy()方法。
servlet采用多线程单实例的模式:
servlet中不应该自定义成员变量。
定义了所有Servlet要实现的方法。
Servlet常用方法:
方法名称 | 功能描述 |
public void init(ServletConfig config) | 由servlet容器调用,用于完成Servlet对象在处理客户请求前的初始化工作 |
public void service(ServletRequest req, ServletResponse) | 由servlet容器调用,用来处理客户端的请求 |
public void destroy() | 由servlet容器调用,释放Servlet对象所使用的资源 |
public ServletConfig getServletConfig() | 返回ServletConfig对象,该对象包含此servlet的初始化和启动参数。返回的ServletConfig对象是传递给init()方法的对象 |
public String getServletInfo() | 返回有关servlet的信息,比如作者、版本和版权。返回的字符串是纯文本。 |
在Servlet初始化过程中获取配置信息,一个Servlet只有一个ServletConfig对象。
ServletConfig常用方法:
方法名称 | 功能描述 |
public String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数值 |
public ServletContext getServletContext() | 返回Servlet的上下文对象引用 |
提供了Servlet与ServletConfig接口的默认实现方法。
Servlet接口的常用方法:
方法名称 | 功能描述 |
public void init(ServletConfig config) | 调用Servlet接口中的init()方法。此方法还有一无参的重载方法,其功能与此方法相同 |
public String getInitParameter(Stringname) | 返回名称为name的初始化参数的值 |
public ServletContext getServletContext() | 返回ServletContext对象的引用 |
继承于GenericServlet,处理HTTP协议的请求和响应。
HttpServlet的常用方法:
方法名称 | 功能描述 |
public void service(ServletRequest req, ServletResponse res) | 调用GenericServlet类中service()方法的实现 |
public void service(HttpServletRequest req, HttpServletResponse res) | 接收HTTP请求,并将它们分发给此类中定义的doXXX()方法 |
public void doXXX(HttpServletRequest req, HttpServletResponse res) | 根据请求方式的不同,分别调用相应的处理方法,例如doGet()、doPost()等 |
获取客户端的请求数据。
ServletRequest接口常用方法:
方法名称 | 功能描述 |
public Object getAttribute(String name) | 获取名称为name的属性值 |
public void setAttribute(String name, Object object) | 在请求中保存名称为name的属性 |
public void removeAttribute(String name) | 清除请求中名字为name的属性 |
除了继承ServletRequest接口中的方法,还增加了一些用于读取请求信息的方法。
HttpServletRequest的常用方法:
方法名称 | 功能描述 |
public String getContextPath() | 返回请求URI中表示请求上下文的路径,上下文路径是请求URI的开始部分 |
public Cookie[] getCookies() | 返回客户端在此次请求中发送的所有cookie对象 |
public HttpSession getSession() | 返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session |
public String getMethod() | 返回此次请求所使用的HTTP方法的名字,如GET、POST |
向客户端发送响应数据。
RervletResopnse接口的常用方法:
方法名称 | 功能描述 |
public PrintWriter getWriter() | public PrintWriter getWriter() |
public String getCharacterEncoding() | 返回在响应中发送的正文所使用的字符编码 |
public void setCharacterEncoding() | 设置发送到客户端的响应的字符编码 |
public void setContentType(String type) | 设置发送到客户端的响应的内容类型,此时响应的状态属于尚未提交 |
除了继承ServletResopnse接口中的方法,还增加了新的方法。
HttpServletResopnse的常用方法:
方法名称 | 功能描述 |
public void addCookie(Cookie cookie) | 增加一个cookie到响应中,这个方法可多次调用,设置多个cookie |
public void addHeader(String name,String value) | 将一个名称为name,值为value的响应报头添加到响应中 |
public void sendRedirect(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL |
public void encodeURL(String url) | 使用session ID对用于重定向的URL进行编码 |
获取Servlet上下文。
ServletContext常用方法:
方法名称 | 功能描述 |
public String getInitParameter(String name) | 获取名称为name的系统范围内的初始化参数值,系统范围内的初始化参数可以在部署描述符中使用context-param元素定义 |
public void setAttribute(String name, Object object) | 设置名称为name的属性 |
public Object getAttribute(String name) | 获取名称为name的属性 |
public String getRealPath(String path) | 返回参数所代表目录的真实路径 |
public void log(String message) | 记录一般日志信息 |
字符编码:
GBK2312、GBK、BIG5、ISO8859-1(默认采用此字符集)、UTF-8、
能读取文本框内中文内容不乱码:
request.setCharacterEnding("utf-8");
输出中文内容不乱码:
resopnse.setContentType("text/html; charset=utf-8");
每种文件都有各自的内容类型(mine-type),在servers>web.xml文件中有定义,html对应–text/html。
初始化参数:
<web-app>
<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>org.jbit.servlet.HelloServletservlet-class>
<init-param>
<param-name>initParamparam-name>
<param-value>Hello Servletparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/HelloServleturl-pattern>
servlet-mapping>
web-app>
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理请求时,doGet()方法被调用。");
String initParam = getInitParameter("initParam");
System.out.println(initParam);
}
<web-app>
<context-param>
<param-name>contextParamparam-name>
<param-value>Hello Servletparam-value>
context-param>
web-app>
public class HelloServlet extends HttpServlet {
// …省略其他代码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理请求时,doGet()方法被调用。");
String initParam = getInitParameter("initParam");
String contextParam = this.getServletContext().getInitParameter("contextParam");
System.out.println("Servlet初始化参数" + initParam);
System.out.println("系统初始化参数" + contextParam);
}
}
servlet类打印html代码输出:
resopnse.setContentType("text/html; charset=utf-8");
PrinterWriter out = request.getWriter();
out.println("HELLO WORLD
");
页面跳转的两种方式:
//重定向
response.sendRedirect("URL");
//请求转发
RequestDispather dispather = request.getResquestDispather("URL");
dispather.forword(request, reponse);
web服务器保存在客户端的一系列文本信息。
//创建Cookie对象
Cookie cookie = new Coolie(String key, String value);
//写入Cookie
response.addCookie();
//读取Cookie
Coolies[] cookies = request.getCookies();
Cookie对象的常用方法:void setMaxAge(int second)、 void setValue(String key)、 String getName()、 String getValue()、 String getMaxAge()。
将servlet部署到Web容器时,会创建一个相当简单的XML文档,这称为部署描述文件(DD),部署描述文件会告诉容器如何运行你的servlet和JSP。
部署描述文件(DD)提供了一种“声明”机制来定制Web应用,而无需修改源代码!
DD的优点:
servlet的存在就是要为客户服务。servlet的任务时得到一个客户的请求,在发出一个响应。
service()方法总是在自己的栈中调用。容器运行多个线程来处理对一个servlet的多个请求。
谁来实现HttpServletRequest和HttpServletResponse接口?这些类在API中吗?——容器、不在。他们要由开发商来实现。
javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttpSession对象中!
通常把HttpSession直接称为Session。
获取Session对象:
HttpSession session = request.getSession();
常用方法:void setAttribute(String key, Object value)、 Object getAttribute(String key)、 void invalidate()、 String getId()、 void setMaxInactiveInterval()、 int getMaxInactiveInterval()、 void removeAttribute()。
注意:存值时,key相同value会覆盖。session失效,其中的值会消失。
session的生命周期:打开浏览器session有效,关闭浏览器/调用invalidata()方法/超时session失效(销毁),默认有效时间为20分钟。
手动设置session失效:
//使用session的方法
session.setMaxInactiveInterval(int second);
//配置文件,就近有效原则,项目下的web.xml优先级高于Tomcat中的web.xml。
int minutes
session与窗口的关系:
session的应用场合:
- 登录成功后存储用户对象。
- 安全退出。
- 后台页面的访问控制。
package gacl.response.study;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 文件下载
*/
public class ResponseDemo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
downloadChineseFileByOutputStream(response);//下载中文文件
}
/**
* 下载中文文件,中文文件下载时,文件名要经过URL编码,否则会出现文件名乱码
* @param response
* @throws FileNotFoundException
* @throws IOException
*/
private void downloadChineseFileByOutputStream(HttpServletResponse response)
throws FileNotFoundException, IOException {
String realPath = this.getServletContext().getRealPath("/download/张家界国家森林公园.JPG");//获取要下载的文件的绝对路径
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);//获取要下载的文件名
//设置content-disposition响应头控制浏览器以下载的形式打开文件,中文文件名要使用URLEncoder.encode方法进行编码,否则会出现文件名乱码
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
InputStream in = new FileInputStream(realPath);//获取文件输入流
int len = 0;
byte[] buffer = new byte[1024];
OutputStream out = response.getOutputStream();
while ((len = in.read(buffer)) > 0) {
out.write(buffer,0,len);//将缓冲区的数据输出到客户端浏览器
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
JSP内置对象是由web容器创造出来的一组对象。常用的JSP内置对象有:out、 request、 response、 session、 application。
指令元素:(3个)
<%@指令元素名 属性名=”属性值” 属性名2=”属性值2”… %>
page指令
通过page指令的属性设置页面的属性信息
import 导包
contentType 内容类型、字符集
每个jsp页面第一行必须是page指令
脚本元素:三个(java代码)
小脚本<% %> java代码
表达式<%= %> 输出
声明<%! %> 方法 (不常用)
注释:
html注释 响应给用户时查看源文件可以看到
jsp注释 响应后查看源文件不可以看到
小脚本中应用java注释
jsp处理流程(执行过程)
翻译阶段 .jsp—.java (Servlet类)
编译阶段 .java—.class
运行阶段 将显示内容显示给用户
为什么第一次访问jsp页面慢,页面内容不改时再次访问速度变快?
第一次访问jsp页面时需要经历翻译-编译-运行阶段
页面内容不改时再访问 可以重用.class文件 直接运行(只经历运行阶段)
jsp与servlet的关系
实质是一个技术
jsp首先会翻译成一个Servlet类再编译、运行
jsp、servlet都能实现页面显示、处理代码
jsp显示更好
servlet处理更好
jsp和servlet搭配应用
tomcat服务器 work文件夹–jsp所翻译的.java、编译的.class文件
jsp页面报错的代码行数–.java文件行数
调错:
404 路径、run as on Server
500 语法错误,抛异常,查看异常信息,提示错误行数
应用system.out…输出
浏览器中右键查看源文件(jsp)
jsp指令元素
page
include 引入页面、包含页面
<%@include file=”页面路径”%>
jsp的作用范围
page 仅在当前页面有效
pageContext对象
request 在当前请求中有效的
点击链接、输入url、表单提交、刷新页面 请求有效(诞生)
页面跳转(路径变化了) 刷新页面 请求失效了 会产生新的请求
如果在request作用范围中存值,必须采用请求转发跳转,跳转后页面中可以获取到request中的值。
session 当前会话中有效
打开浏览器session有效
关闭浏览器、session超时、session手动卸载(session.invalidate())session失效
application 当前应用程序中有效
打开服务器时application有效
关闭服务器时application失效
作用范围从小到大
page–request–session–application
ServletContext
应用:
page 用的很少
request 一般用来存用一次的数据
session 一般用来存用户信息、购物车(跟踪)
application 范围最大的 一般用来存公有信息、计算访问人数
原则:
能用小的就不用大的
请求转发和重定向
如果在request作用范围中存值,必须采用请求转发跳转。
其他情况重定向
cookie和session的对比: