目录
在IDEA开发工具中集成Tomcat的操作实现项目的快速部署
servlet实例配置的第二种方式:使用@WebServlet注解进行配置
2.tomcat服务器从请求的行中获取请求的资源路径 /hello/my tomcat就知道浏览
3.tomcat服务器根据项目名去加载项目对应的核心配置文件web.xml并对该文件进行
4.根据解析后的结果确定当前请求应该由哪个servlet进行出来 /my----->MyServlet
6.请求处理完成后一定要在servlet中给客户端浏览器一个响应的结果,这个响应过程
资源类型有两种:1.web目录下的静态资源 html css js img... 2.动态资源
B/S结构browser server:浏览器服务器架构
web :工作模式:请求request 处理 响应response
网络上两台计算机相互通信;
- 通信一定要遵循标准通信协议,才能实现双方有效沟通
HTTP协议:
- 规范了客户端浏览器和java应用程序的传输数据格式
- 主要有两个格式:
- 请求数据包格式
- 响应数据包格式
- 前端:提交
- 后台:接收
HTTP请求:按照http协议请求发送的字符串 网络上传输的是字节流;
需要转换为字符流
GET和POST :请求的提交方式; GET长度有限制,明文提交不安全 ,不能提交文件
get: 请求
POST:请求
- HTTP/1.1:请求行的使用协议版本
- post提交:以请求主体的方式提交
- get提交:在url后面
- 空行:分隔符
响应请求:
- java客户端->后台->响应-> (严格遵循http协议格式)
响应行:三部分: 用空格隔开
- 1.使用协议版本:http/1.1
- 2.响应状态码 :200:成功 404:找不到资源 500:发生了异常
- 3.响应状态文字:200->ok 404->not found 500->internal error
响应头信息:服务器发给浏览器
和请求头信息一样;key:value的格式
空格:分隔符:间隔响应头和响应主题信息
响应主题内容:真正发送的主题内容
web服务器tomcat
- tomcat 基于java语言开发运行需要jdk tomcat和jdk版本对应
tomcat目录结构
- bin: startup.bat 可执行的二进制文件
- shutdown.bat
- conf: config :tomcat 配置文件
- server.xml :服务器自身核心配置文件
- web.xml:服务器部署的全局项目配置文件
- lib:tomcat 本身运行所依赖的jar包
- logs:运行的日志文件
- webapps:放置 web项目
- work :tomcat工作目录:放置jsp解析后的结果
如何在tomcat服务器上进行项目的部署
在IDEA开发工具中集成Tomcat的操作实现项目的快速部署
java web项目的目录结构认识:
所有的项目代码放到web目录下; jar包放在web-inf下的lib包
配置tomcat服务自动更新
Servlet
- 服务端小程序,用JAVA语言编写并可以部署在tomcat服务器中能够对客户端浏览器
- Servlet本质上就是一个JAVA类,但是因为这种类将来需要部署到服务器环境对客户
- Servlet就是一个接口规范
- servlet读取xml配置文件
-
web.xml
-
<servlet> <!-- 完成servlet注册--> <servlet-name>myServlet</servlet-name> <servlet-class>com.zdq.myServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/my</url-pattern> <!-- url是浏览器的访问位置--> </servlet-mapping>
-
-
servlet访问的步骤
- 前端输入数据;回车之后向服务器发送get请求 ;
- tomcat获取到请求行 :/hello/my?username=zhangsan&password=123
- 解析web.xml -> 获取到my->访问指定的servlet
- new一个servlet对象;将请求头赋给servlet的request对象
Servlet的开发步骤:
<servlet> <servlet-name>MyServlet</servlet-name>
<servlet-class>com.qf.MyServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/my</url-pattern>
</servlet-mapping>
//servlet-name的名字必须一样 url-pattern是用来配置当前servlet在浏览器端的访问路径
servlet实例配置的第二种方式:使用@WebServlet注解进行配置
@WebServlet("/my2")
两种配置方式的比较:
servlet的访问过程
1.请求首先到达tomcat服务器
2.tomcat服务器从请求的行中获取请求的资源路径 /hello/my tomcat就知道浏览
3.tomcat服务器根据项目名去加载项目对应的核心配置文件web.xml并对该文件进行
4.根据解析后的结果确定当前请求应该由哪个servlet进行出来 /my----->MyServlet
5.创建一个MyServlet实例对象,
6.请求处理完成后一定要在servlet中给客户端浏览器一个响应的结果,这个响应过程
通过注解配置servlet:坏处:和代码耦合度高一些
//注解servlet @WebServlet("/my") //默认是value= 是字符串数组;可以注解多个 ({"my","my2","my3"}) public class myServlet implements Servlet{
一个web工程中包含的资源类型
资源类型有两种:1.web目录下的静态资源 html css js img... 2.动态资源
org.apache.catalina.servlets.DefaultServlet:是apache提供好的专门用来处理静
态资源的servlet
在tomcat conf 有一个web.xml文件,专门有配置处理静态资源,通过流输出给浏览器
web.xml文件对静态资源的配置 url为/
-
无论是静态资源还是动态资源,都是由servlet执行;
- 静态资源会被.DefaultServlet执行
-
<servlet-mapping><servlet-name> default </servlet-name><url-pattern> / </url-pattern></servlet-mapping>
-
//缺省配置;没有针对当前配置的servlet就都是defaultservlet
-
- 对于html静态文件的处理过程对于任何项目来说都应该是一样(直接读取这个html 文件的内容并响应给浏览器即可),因此tomcat中提供了一个DefaultServlet专门处 理静态资源
servlet的生命周期
- servlet本身也是一个对象;由tomcat容器创建
- servlet在第一次访问时创建;并且只会创建一次;(单例模式)
- server(,)每次有请求都会创建 (多线程)
- 由tomcat自动完成
- init( )//初始化servlet方法,只会创建一次;
- servlet实例全局共享;所以一般不在servlet写成员变量
- destory()关闭tomcat服务器时做关键信息的输出;和数据保存
- servlet在第一次被访问时才会创建对象;想要tomcat创建时启动;就需要在当前servlet.java里配置
httpServlet
-
写法:
public class myServlet extends HttpServlet {//httpservlet继承 GenericServlet 实现了Servlet @Override//req继承自ServletRequest resp继承自 ServletResponse protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); // resp.setCharacterEncoding("utf-8"); System.out.println("------------------------------------------------------获取到前端的字符串"); String username = req.getParameter("username"); String password = req.getParameter("password"); service addService = new serviceImpl(); addService.addUser(username, password); resp.getWriter().write("这是中文"); System.out.println(username + password); }
- 虽然看上去是doGet()在处理请求;但实际上是service在处理前端的请求;
- 用继承HttpServlet的好处
- 不需要强制重写Servlet的所有方法;
- 实际上:
myServlet extends HttpServlet
extends GenericServlet
implements Servlet
doGet的参数:处理get请求
- doGet(HttpServletRequest req, HttpServletResponse resp)
-
req继承自ServletRequest resp继承自 ServletResponse
-
doPost:处理post请求
-
doPost(HttpServletRequest req, HttpServletResponse resp)
目前浏览器支持的提交方式
浏览器请求服务器的几种方式
- 直接在地址栏输入url 回车直接发送GET请求
- 以a标签完成服务器资源请求;也是get请求
- <a href="/day41/test?name=list"></a>
- 使用表单请求服务器; 可以发送get和post请求 取决于form的method
- <form action="/day41/test" method="post"></form>
- 普通的button 的onclick事件 传一个function() get请求
- 使用img标签 设置src属性; 发送get请求
- img的src在页面一加载就出现了
- link 标签的href 标签
- script标签
- 使用ajax技术实现异步请求web服务器 其他的都是同步提交
- 304表示本地的静态缓存文件
request和respond对象常用方法、
- request对象的常用的方法介绍
- getParameter(“name”):根据参数名获取提交过来的参数值 返回一个String
-
post提交的中文乱码问题处理:request.setCharacterEncoding(“utf-8”);
-
2.getParameterValues(“name”):根据参数名获取多个参数值,返回一个String数组 主要针对复选框
-
获取请求行的信息
-
String method = request.getMethod();
-
System.out.println("method = " + method);
-
String uri = request.getRequestURI();
-
System.out.println("uri = " + uri);//相对路径
-
StringBuffer url = request.getRequestURL();
-
System.out.println("url = " + url);//完整的绝对路径
-
-
//获取请求的头信息
-
key:value String host = request.getHeader("Host");
-
System.out.println("host = " + host);
-
- response对象:用来给客户端浏览器一个响应
-
response.setHeader("Content-Type","text/html;charset=utf-8");//设置响应的头信息 PrintWriter writer = response.getWriter(); //调用response对象的相关方法设置响应头信息 writer.write("<h1>你好浏览器!</h1>");
乱码解决
- 1:post方式提交乱码(即控制台) req.setCharacterEncoding("utf-8");
- 2:网页输出乱码 resp.setHeader("Content-Type","text/html;charset=utf-8"); resp.setHeader("Content-Type","text/plan;charset=utf-8");
-
servlet应用于三层的实例
- 三层:dao :做数据访问 service 服务层 web层:与前段做交互层
- servlet是一个纯ui技术;只负责ui相关工作
-
在web项目中lib目录放到WEB-INF中
-
在servle类中只能完成下列工作:
-
1.接收客户端浏览器的请求
-
2.从请求中获取请求的参数
-
3.调用业务方法进行功能的处理
-
4.将业务处理的结果通过response对象响应给客户端浏览器
-
在服务端程序中凡是涉及到对服务器磁盘文件的IO操作,必须提供文件的绝对路径
-
项目部署目录
- out目录:是部署项目目录;
- web目录下有所有的静态资源;
- src目录下是所有的java.class文件
- resources目录参与项目部署
-
相对路径转绝对路径的方式
1:定义一个相对路径 注:此处的相对路径是我们运行后的out部署目录下的相对路径:见下图
String relativePath="/WEB-INF/test.html";
//此处是将网页文件放到WEB-INF目录下后的部署文件的相对路径
2:调用 getServletContext() 方法,此方法每个servlet都可以调用
// 此方法用于获取一个 servlet 的上下文对象;
这个上下文对象对于整个项目来说,全局只有一份
// 它实在 tomcat 启动时立马创建的
// 该对象中提供了一个 context.getRealPath
(传一个相对路径) 方法,用于将 相对路径转绝对路径
ServletContext context = this.getServletContext();
String realPath = context.getRealPath(relativePath);
//传一个相对路径,返回一个绝对路径
//System.out.println(realPath); // 结果:绝对路径:D:\idea\ideaWork\day42\out\artifacts\day42_war_exploded\test.html
3:通过获取的绝对路径读取网页信息
BufferedReader reader=new BufferedReader(new InputStreamReader
(new FileInputStream(realPath),"utf-8"));
StringBuffer sb=new StringBuffer();
String line="";
while ((line=reader.readLine())!=null){
sb.append(line);
}
String html=sb.toString();
html=html.replace("{{errorInfo}}","账户或密码错误!");
resp.getWriter().write(html);
}
servlet层:
package com.qf.web;
//负责接收用户的登录请求(POST)
@WebServlet("/login")
public class UserLoginServlet extends HttpServlet {
//不存在多线程安全问题
private UserService service= new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-Type","text/html;charset=utf-8");
//处理用户的第一次登录
String relativePath="/WEB-INF/login.html";
ServletContext context = this.getServletContext();
//这个对象全局只有一份;在tomcat启动时创建;
//上下文对象中提供了一个方法可以用于相对路径转绝对路径的一个方法getRealPath
String realPath = context.getRealPath(relativePath);
BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"utf-8"));
StringBuffer sb=new StringBuffer("");
String line="";
while((line=reader.readLine())!=null){
sb.append(line);
}
String html=sb.toString();
html=html.replace("{{errorInfo}}","");
response.getWriter().write(html);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求的参数
String username = request.getParameter("username");
String password=request.getParameter("password");
//2.调用业务方法
boolean flag = service.checkUserLogin(new User( username, password));
//3.根据业务处理的结果进行响应
response.setHeader("Content-Type","text/html;charset=utf-8");
//以网页输出
if(flag){
response.getWriter().write("登录成功!");
}else{
//登录失败
//给浏览器响应一个网页(String)
// String html="<!DOCTYPE html>\n" +
// "<html lang=\"en\">\n" +
// "<head>\n" +
// " <meta charset=\"UTF-8\">\n" +
// " <title>系统登录</title>\n" +
// "</head>\n" +
// "<body>\n" +
// " <form action=\"/web/login\" method=\"post\">\n" +
// " <table>\n" +
// " <tr>\n" +
// " <td>账号:</td>\n" +
// " <td><input name=\"username\"></td>\n" +
// " </tr>\n" +
// " <tr>\n" +
// " <td>密码:</td>\n" +
// " <td><input type=\"password\" name=\"password\"></td>\n" +
// " </tr>\n" +
// " <tr>\n" +
// " <td><input type=\"submit\" value=\"登录\"></td>\n" +
// " <td style=\"color:red\">用户名或密码错误!</td>\n" +
// " </tr>\n" +
// " </table>\n" +
// " </form>\n" +
// "</body>\n" +
// "</html>";
//使用IO流技术从磁盘上直接读取login.html中的文本内容
//相对路径转绝对路径
String relativePath="/WEB-INF/login.html";
//每个servlet中都可以调用getServletContext()方法获取到一个servlet上下文对象
//这个对象对于整个项目来说全局只有一份,在tomcat一启动的时候立马创建
//上下文对象中提供了一个方法可以用于相对路径转绝对路径的一个方法getRealPath
ServletContext context = this.getServletContext();//获取到一个servlet上下文对象
//这个对象全局只有一份;在tomcat启动时创建;
//上下文对象中提供了一个方法可以用于相对路径转绝对路径的一个方法getRealPath
String realPath = context.getRealPath(relativePath);
//System.out.println(realPath);
BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"utf-8"));
//System.out.println(reader);
StringBuffer sb=new StringBuffer("");
String line="";
while((line=reader.readLine())!=null){
sb.append(line);
}
String html=sb.toString();
html=html.replace("{{errorInfo}}","账号或密码错误!");
response.getWriter().write(html);
}
}
}