文章目录
javaWeb
一、课程目标
【掌握】tomcat安装配置
【掌握】tomcat发布静态项目
【理解】servlet接口
【掌握】HttpServlet使用
二、tomcat安装配置
tomcat提供了多平台解压与安装版
解压版:直接解压基本配置已经配置完成,需要根据系统与位数选择解压安装指定的版本,由于解压版不知道是在window还是linux使用,所以提供了两个对应的执行脚本
安装版:只需要选择系统,在安装的过程中会自动进行位数的匹配,安装版需要在安装过程中手动填写配置
目录
目录 | 用途 |
---|---|
/bin | 存放启动和关闭Tomcat的脚本 |
/conf | 存放Tomcat的各种配置文件 |
/lib | 存放Tomcat服务器和所有web程序需要访问的jar文件 |
/logs | 存放Tomcat的日志文件 |
/temp | 存放Tomcat运行时产生的临时文件 |
/webapps | 当发布web应用程序时,通常把web程序放置到该目录下 |
/work | Tomcat将JSP生成的Servlet源文件和字节码文件放置到该目录下 |
tomcat安装配置注意事项:
1、tomcat基于java运行环境所以必须在配置环境变量之后进行安装
2、安装版需要手动配置相关配置
3、可以通过conf目录进行配置的修改
三、发布静态项目
我们有一个静态网站,假设网站的项目名字叫sms,现在将它发布到Tomcat中去需要以下步骤:
步骤一:在webapps目录下新建一个sms目录
步骤二:将我们的静态网页复制粘贴到sms目录下
步骤三:启动服务器,在浏览器中输入http://localhost:8080/sms/index.html
四、servlet
4.1 创建动态web工程
4.1.1 eclipse创建web工程
右键new->project输入web
选择Dynamic Web Project点击next
Project name:项目名
Target tuntime:运行服务器实例(这个项目交由那个服务器对象运行)
Dynamic web modle version:创建项目模板版本2.5或3.0之后的版本
文件目录
java Resources:存放java使用的资源(服务器处理资源)
WebContent:存放的是网页资源与tomcat服务器运行当前项目资源
src:存放书写的java代码与配置文件
lib:存放项目运行时使用的额外的jar包(注意:web项目只需要将jar包粘贴进来会自动进行导入,无需手动导入)
4.1.2 idea创建web工程
idea没有像eclispe直接创建使用的模板,都需要在创建后进行配置
new project选择java Enterprise 选择已经配置好的tomcat服务
创建普通java项目后添加web
在WEB-INF下分别创建文件夹
classes:存放编译后的代码
lib:存储项目运行时使用的jar包
创建后进行文件夹标识设置
将当前项目输出位置改为指定位置(classes不创建不配置也可以)
将lib目录添加到当前项目使用的资源位置
4.2 概念
在服务器端运行的用于处理用户请求并给予相应的java代码
servlet是一个接口,任何实现这个接口的类都可以进行服务的处理与响应
需要tomcat的支持与额外的配置进行一同调用
生命周期方法:
void init(ServletConfig config) 用于初始化Servlet
void service(ServletRequest req ,ServletResponse resp) 用于处理用户请求且做出响应
void destroy() 用于从容器中销毁该Servlet实例
获取该Servlet对应的ServletConfig
ServletConfig getServletConfig() 返回该Servlet对应的配置对象
获取Servlet的信息
String getServletInfo() 用于获取Servlet的信息,如:作者,版本等内容
4.3 使用servlet接口实现服务的处理
1、书写类实现servlet接口 重写相应方法
package com.yunhe.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet implements Servlet{
@Override//销毁方法 servlet销毁时执行
public void destroy() {
System.out.println("销毁");
}
@Override//获取servlet配置方法 一般用于获取配置文件中配置的数据
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override//获取servlet信息方法 一般用于获取servlet版本 作者等信息
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("初始化创建");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("服务被调用");
}
}
2、在web.xml进行当前服务的配置
<!-- 用于配置servlet使其在服务器启动时进行加载并进行使用 -->
<!-- 配置一个servlet服务并指定代码位置与名字 名字可以随便起但注意不要与其他servlet配置重名 -->
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.yunhe.servlet.MyServlet</servlet-class>
</servlet>
<!-- 配置servlet服务地址 -->
<!-- 配置指定地址与已经配置好的servlet之间的关系 -->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
4.4 使用GenericServlet抽象类实现服务的处理
GenericServlet不仅帮我们实现了servlet接口中的部分方法同样实现了序列化接口
1、书写类继承GenericServlet实现相应服务处理方法,如果想进行其他方法可以使用重写
package com.yunhe.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet2 extends GenericServlet{
private static final long serialVersionUID = -879916588354250592L;
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("GenericServlet实现");
}
}
2、在web.xml进行当前服务的配置
<!-- 用于配置servlet使其在服务器启动时进行加载并进行使用 -->
<!-- 配置一个servlet服务并指定代码位置与名字 名字可以随便起但注意不要与其他servlet配置重名 -->
<servlet>
<servlet-name>myServlet2</servlet-name>
<servlet-class>com.yunhe.servlet.MyServlet2</servlet-class>
</servlet>
<!-- 配置servlet服务地址 -->
<!-- 配置指定地址与已经配置好的servlet之间的关系 -->
<servlet-mapping>
<servlet-name>myServlet2</servlet-name>
<url-pattern>/myservlet2</url-pattern>
</servlet-mapping>
4.5 使用Httpservlet抽象类实现服务的处理
之前的servlet书写都是使用serive方法进行服务的统一处理,但是对于http协议的请求而言,请求的方式有7种,所以sun公司针对于http协议的servlet进行封装提供了HttpServlet进行不同请求的处理
HTTP请求方法 | HttpServlet对应的处理方法 |
---|---|
GET | doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException |
POST | doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException |
HEAD | doHead(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException |
PUT | doPut(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException |
DELETE | doDelete(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException |
TRACE | doTrace(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException |
OPTIONS | doOptions(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException |
1、书写类继承httpservlet重写需要实现的方法
package com.yunhe.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHttpServlet extends HttpServlet {
// 通过重写相应处理方法进行服务的书写
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get请求执行");
}
}
2、配置web.xml文件
<servlet>
<servlet-name>myServlet3</servlet-name>
<servlet-class>com.yunhe.servlet.MyHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet3</servlet-name>
<url-pattern>/myservlet3</url-pattern>
</servlet-mapping>
可以通过eclipse提供的模板快速创建servlet并自动进行xml的配置
五、HttpServletRequest
5.1 概念
将客户端的请求数据封装为一个类,每次请求创建一个请求对象,HttpServletRequest就是针对于http请求数据创建的数据对象(可以获取客户端发送的数据)继承自javax.servlet.ServletRequest接口
5.2 常用方法
从ServletRequest继承而来的常用方法有:
方法 | 用途 |
---|---|
getAttribute(String name) | 获取属性值 |
setAttribute(String name, Object o) | 设置属性值 |
getCharacterEncoding() | 获取字符编码集 |
setCharacterEncoding(String env) | 设置字符编码集 |
getParameter(String name) | 获取参数的值 |
getParameterValues(String name) | 获取参数的多个值 |
getRemoteAddr() | 获取客户端IP地址 |
getRequestDispatcher(String path) | 构建一个转发对象 |
方法 | 用途 |
---|---|
getCookies() | 获取cookie数组 |
getHeader(String name) | 获取HTTP请求头信息 |
getRequestURL() | 获取URL |
getQueryString() | 获取QueryString |
getSession() | 获取或构建会话 |
六、HttpServletResponse
6.1 概念
将服务器端的响应数据封装为一个类,对于客户端的每次请求创建一个响应对象,HttpServletResponse就是针对于http请求数据后响应创建的数据对象(可以将服务器端数据发送给客户端)继承自javax.servlet.ServletResponse接口
6.2 常用方法
HttpServletResponse提供了一些HTTP响应常用的方法:
方法 | 用途 |
---|---|
setContentType(String type) | 设置内容类型 |
addCookie(Cookie cookie) | 设置客户端Cookie |
setHeader(String name,String value) | 设置响应头信息 |
sendRedirect(String location) | 设置跳转页面 |
七、ServletContext与ServletConfig
基本用于一些配置与配置的获取
7.1 ServletContext
上下文对象,代表的是当前服务器应用的生命周期,在整个程序运行过程中只会存在一个上下文对象,并且管理者所有的servlet(所有的servlet都能获取上下文对象)
7.1.1 获取上下文对象的方式
(1)通过当前servlet直接获取
//获取上下文对象
//在任意servlet方法中通过getServletContext()方法获取
ServletContext sc1 = this.getServletContext();
(2)通过当前servlet对应的config对象获取
//通过servletConfig对象进行获取
//针对于每个servlet都会创建一个servletConfig对象
//与直接获取没有什么区别
ServletContext sc2 = this.getServletConfig().getServletContext();
7.1.2 使用
(1)获取当前服务器运行配置的全局参数
getInitParameter(String key)
搭配web.xml中的配置
通过key获取value
web.xml
<!-- 在全局配置中配置统一的编码 -->
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
servlet
ServletContext sc1 = this.getServletContext();
//作用1:通过getInitParameter(name)方法获取对应配置中name对应的value值
String initParameter = sc1.getInitParameter("encoding");
System.out.println(initParameter);
(2)获取其它servlet存储的数据
在servlet中,域对象一共有3种.上下文域对象是其中一种
* 域对象是用来做存取值操作的.
* 在域对象中保存的值,只要域对象没有销毁,那么域对象中的值就始终存在
* 作为上下文域对象,取值范围最广泛.
* 当我们将值存放到上下文域对象中之后,上下文对象不销毁,里面存的值也始终存在.服务器关闭,上下文对象销毁,里面的值也随之销毁.域对象的存取值和值的是否销毁,与浏览器是否重启无关
* 域对象的常用方法:
* 存值: 域对象.setAttribute(String key,Object value)
* 取值: 域对象.getAttribute(String key) Object value
* 移除值: 域对象.removeAttribute(String key)
由于上下文对象可以被所有的servlet获取到,所以servlet1存储在上下文对象的数据,servlet2也可以获取到
servlet1
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取上下文对象
ServletContext sc = this.getServletContext();
//通过方法进行赋值
sc.setAttribute("key","s1setValue");
}
}
servlet2
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取上下文对象
ServletContext sc = this.getServletContext();
//通过方法进行获取指定key的value
Object key = sc.getAttribute("key");
System.out.println(key);
}
}
(3)获取当前项目路径
getRealPath("/");
//获取当前项目的真实路径
String realPath = sc.getRealPath("/");
//F:\ai\code\idea0312\out\artifacts\idea0312_war_exploded\
System.out.println(realPath);
7.2 ServletConfig
每个servlet在创建时都会创建一个对应的config对象,通过这个对象进行初始化配置,可以在init方法中,通过这个对象获取当前servlet在xml中的配置文件
7.2.1 获取
可以直接通过servlet方法获取,在servlet初始化方法中会自动使用对应的配置对象进行初始化
/*
* ServletConfig对象的取得:
* ServletConfig config = this.getServletConfig();
* 变量名:config
*/
@Override
public void init(ServletConfig config) throws ServletException {
//创建ServletConfig对象的过程
super.init(config);
}
7.2.2 使用
(1)获取当前servlet的相应name配置
//获取当前servlet在web.xml配置的name属性的值
String servletName = servletConfig.getServletName();
System.out.println(servletName);
(2)获取在web.xml中为当前servlet配置的初始化属性,通过key获取对应value
web.xml
<servlet>
<servlet-name>s1sadsaadsd</servlet-name>
<servlet-class>com.yunhe.servlet.Servlet1</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
<init-param>
<param-name>name1</param-name>
<param-value>value1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>s1sadsaadsd</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
servlet
//获取配置对象
ServletConfig servletConfig = this.getServletConfig();
//获取当前servlet初始化配置的值
String name = servletConfig.getInitParameter("name");
String name1 = servletConfig.getInitParameter("name1");
System.out.println(name+"|"+name1);
八、功能书写
8.1 获取前台客户端传递的参数数据
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前台传递的数据请求携带的数据
//从请求对象中获取
//使用getParameter(name)的方式获取请求的指定数据
String username = req.getParameter("username");
System.out.println(username);
//获取多个数据
String[] likes = req.getParameterValues("like");
for (String like : likes) {
System.out.println(like);
}
//将请求数据返回给客户端
//使用响应对象方法获取相应的输出流
PrintWriter writer = resp.getWriter();
writer.println(username);
}
8.2 解决请求响应数据乱码问题
(1)在上下文对象设置统一的编码格式数据
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
(2)在每个servlet中获取并进行设置
//在获取数据之前将请求与相关编码进行修改
String encoding = req.getServletContext().getInitParameter("encoding");
System.out.println(encoding);
req.setCharacterEncoding(encoding);
resp.setCharacterEncoding(encoding);
resp.setContentType("text/html;charset="+encoding);
8.3 response响应动态页面
使用相应对象的输出流方法在客户端输出动态页面
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//在获取数据之前将请求与相关编码进行修改
String encoding = req.getServletContext().getInitParameter("encoding");
req.setCharacterEncoding(encoding);
resp.setCharacterEncoding(encoding);
resp.setContentType("text/html;charset="+encoding);
//获取响应输出流
PrintWriter writer = resp.getWriter();
//获取前台传入的账号数据
String username = req.getParameter("username");
System.out.println(username);
if("".equals(username)||username.contains(" ")){
writer.println("<font color='red'>账号不能为null</font>");
}else {
writer.println("<font color='green'>"+username+"欢迎登陆!</font>");
}
writer.flush();
writer.close();
}
九、转发与重定向的区别
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发
//将本次请求转发到其他服务进行处理
//获取转发对象填入转发位置
//(1)将当前服务转发到另一个服务执行
//req.getRequestDispatcher("/test4").forward(req,resp);
//(2)将当前请求转发到另一个页面
//跳转至web公开目录下
//req.getRequestDispatcher("OK.html").forward(req,resp);
//跳转至web-inf目录下
//req.getRequestDispatcher("WEB-INF/OK.html").forward(req,resp);
//重定向
//告诉客户端本次请求处理结束 你需要继续请求其他服务处理
//resp.sendRedirect("/test4");
//跳转至web公开目录下
//resp.sendRedirect("OK.html");
}
区别
1、语法区别
转发是请求对象调用方法进行转发,重定向是响应对象调用方法进行重定向
2、地址栏变化区别
请求转发请求服务地址不会发生变化,重定向地址栏会变为最终响应的服务地址
3、客户端请求次数的区别
请求转发客户端只请求一次,重定向客户端可能请求多次
4、请求资源的区别
请求转发由于是服务器内部操作所以可以访问WEB-INF下服务器的内部资源,重定向是客户端请求不能直接请求服务器内部资源
5、请求速度的区别
转发是服务器内部操作 所以速度快
6、数据携带的区别
转发可以携带上次请求的数据,重定向不会
7、跳转位置的区别
转发由于携带参数所以只能本服务器之间服务进行转发操作,重定向是客户端重新请求所以可以请求其他服务器服务