同为java主流开发工具,用于代码开发
区别:
1、工作空间
eclispse使用的是是唯一工作空间的原则,将使用eclispe开发的所有项目系统存放至指定的工作空间,由于所有项目存在同一工作空间,eclipse可以快速的对同一工作空间的不同项目进行切换
idea则为每个项目单独创建指定目录空间,所以idea每次每个工作区只能操作一个项目,但是可以启动多个工作区
2、代码提示
eclipse可以通过配置全字母进行代码的自动提示
idea自带代码全字母提示,配置忽略大小写后提示功能更完善并且对于导包,字符串设置都有提示
3、插件功能
eclipse虽然拥有很多的插件匹配,但相对于idea而言就没有那么完善了
修改编码集
设置ctrl+鼠标滚轮修改字体大小
设置自动导包
忽略大小写提示
https://blog.csdn.net/qq_36135928/article/details/90348725
1、点击new->Project…
2、选择对应模板选择指定tomcat服务
3、如果没有配置过tomcat需要首先配置tomcat
4、配置tomcat项目默认打开以及访问项目名
**URL:**Idea启动tomcat后自动打开的浏览器以及浏览器默认访问的地址(一般不进行修改,在修改项目访问名称后会自动修改)
**HTTP port:**访问端口号
项目访问路径(/必须)
5、配置classes与lib
calsses用于保存运行编译的class文件
lib用于保存项目运行时需要的jar包
(1)在WEB-INF下分别创建classes与lib文件夹
(2)打开项目配置
选择自定义输出位置将之前的classes位置选择
配置lib自动导入jar包
在服务器运行期间用于对非静态资源请求做出处理并给予响应的程序
要想在web通过tomcat执行java代码,那么就必须实现servlet接口
生命周期方法:
void init(ServletConfig config) 用于初始化Servlet
void service(ServletRequest req ,ServletResponse resp) 用于处理用户请求且做出响应
void destroy() 用于从容器中销毁该Servlet实例
servlet的生命周期基于三个相应的方法
服务器启动后,当客户端第一次请求对应servlet时,调用对应servlet init()方法进行初始化创建,在程序执行期间每次请求重复调用service()方法进行服务的处理,当服务器正常关闭时,调用destroy()方法执行销毁
tomcat执行时对应的serlvet实例是单例模式,当客户发送http请求至tomcat,tomcat解析请求,根据地址查找对应web.xml,上所有的servlet-mappring中的url-pattern值中进行匹配,如果没有匹配项返回404,如果存在匹配性获取对应servlet-name继续上servlet的servlet-name进行匹配获取对应servlet-class使用反射进行操作,进行操作前会进行判断,是否已经实例化过,如果创建过(不是第一次被请求)那么直接返回请求的对象调用service方法,如果没有请求过(第一次被请求),调用init方法进行初始化创建之后调用service方法处理请求。service方法在服务器运行期间随着客户的请求重复调用,服务器关闭时,会在关闭之前自动调用destroy方法进行销毁
获取该Servlet对应的ServletConfig
ServletConfig getServletConfig() 返回该Servlet对应的配置对象
1、创建java类实现servlet接口
import javax.servlet.*;
import java.io.IOException;
//创建java类 实现servlet接口
//注意servlet包由tomcat提供 所以一定首先配置tomcat
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet初始化");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("serlvet被调用");
}
@Override
public void destroy() {
System.out.println("servlet销毁");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
2、在web.xml中配置请求路径与servlet之间的联系
<servlet-mapping>
<servlet-name>testservlet-name>
<url-pattern>/testurl-pattern>
servlet-mapping>
<servlet>
<servlet-name>testservlet-name>
<servlet-class>com.yunhe.servlet.MyServletservlet-class>
servlet>
为简化Servlet的编写,sun提供了一个实现Servlet接口的抽象Servlet类,主要实现了类的序列化,配置
1、创建java类继承GenericServlet抽象类重写相应方法
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//继承GenericServlet抽象类
public class MyGenericServlet extends GenericServlet {
//GenericServlet中帮我们实现了大部分方法 但service作为服务方法每个servlet可能不同所以需要我们实现
//如果对于GenericServlet提供的方法不想使用或功能额外添加可以使用重写的方式
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//servletRequest用于存放请求的所有内容
//servletResponse用于相应客户端的对象
//从相应对象中获取可以输出至客户端的打印流对象
PrintWriter writer = servletResponse.getWriter();
writer.println("hello world!");
}
}
2、书写配置文件
<servlet-mapping>
<servlet-name>MyGenericServletservlet-name>
<url-pattern>/test1url-pattern>
servlet-mapping>
<servlet>
<servlet-name>MyGenericServletservlet-name>
<servlet-class>com.yunhe.servlet.MyGenericServletservlet-class>
servlet>
注意:在进行xml配置时,不能出现相同的url与name,但是不同的url与name可以指向相同的class
为了能够快速开发适用于HTTP协议的Servlet类,sun提供了一个抽象类HttpServlet
javax.servlet.http.HttpServlet
继承自GenericServlet
适用于JavaWeb应用程序Servlet
除了继承自GenericServlet的方法外,HttpServlet还提供了7个处理HTTP请求的方法
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,重写相应的请求处理方法
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//sun公司提供的针对于http协议处理的setvlet
public class myHttpServlet extends HttpServlet {
//用于处理get请求的方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get请求处理");
}
//用于处理post请求的方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post请求处理");
}
}
2、配置web.xml映射
<servlet-mapping>
<servlet-name>myHttpServletservlet-name>
<url-pattern>/test2url-pattern>
servlet-mapping>
<servlet>
<servlet-name>myHttpServletservlet-name>
<servlet-class>com.yunhe.servlet.myHttpServletservlet-class>
servlet>
java的重写注解 重载注解 函数式接口注解,这些就是一些限制性的注解
servlet3.0以上版本推出了注解开发,使用webservlet注解并填入相应的参数实现0配置
通过注解与相应参数的传入可以避免麻烦的web.xml的配置
使用模板与注解实现servlet的编写
1、点击相应的模板创建
模板与servlet由tomcat提供所以必须先配置tomcat
2、输入创建servlet的名字
3、修改注解进行地址映射
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/asd")
//通过注解形式进行快速配置
//这个注解相当于web.xml中的相应配置 所以同样不能出现相同的地址
public class FinalServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("get");
}
}
上下文对象概述及生命周期
上下文对象在项目中,是一个全局管理者.是单例的,只有一个
在服务器启动的时候,服务器会自动的为我们创建出来一个上下文对象.这个上下文对象始终存储在服务器上.当服务器关闭,上下文对象销毁.
上下文对象作为项目的全局管理者,可以服务于每一个servlet.
每一个servlet都可以随时随地的取得并使用上下文对象.
上下文对象的取得方式
* 取得上下文对象的方式:
*
* 取得方式1:
* ServletContext application = this.getServletConfig().getServletContext();
* 变量名:必须叫application
*
* 取得方式2:
* ServletContext application = this.getServletContext();
*
* 未来的实际项目开发,使用第二种方式来取得上下文对象,因为简单方便.
* 注意:第二种方式,虽然没有调用getServletConfig()方法,但是内部的实现原理仍然是先调用了getServletConfig()方法,只不过在代码中省略掉了而已.
*
* 第一种方式和第二种方式的实现原理是一模一样的,第二种是第一种的简写形式.
(1)获得全局初始化参数
getInitParameter(String key)
搭配web.xml中的配置
通过key获取value
<context-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
context-param>
通过上下文对象可以获取web.xml中配置的相应name的value
ServletContext servletContext = this.getServletContext();
String encoding = servletContext.getInitParameter("encoding");
System.out.println(encoding);
(2)作为域对象存取数据
在servlet中,域对象一共有3种.上下文域对象是其中一种
* 域对象是用来做存取值操作的.
* 在域对象中保存的值,只要域对象没有销毁,那么域对象中的值就始终存在
*
* 作为上下文域对象,取值范围最广泛.
* 当我们将值存放到上下文域对象中之后,上下文对象不销毁,里面存的值也始终存在.服务器关闭,上下文对象销毁,里面的值也随之销毁.域对象的存取值和值的是否销毁,与浏览器是否重启无关
* 域对象的常用方法:
* 存值: 域对象.setAttribute(String key,Object value)
* 取值: 域对象.getAttribute(String key) Object value
* 移除值: 域对象.removeAttribute(String key)
ServletContext servletContext = this.getServletContext();
//获取上下文对象中key属性为key的值返回object类型的数据
Object key = servletContext.getAttribute("key");
if(key==null){
//设置指定key属性为key的value的值为1
servletContext.setAttribute("key",1);
}else{
servletContext.setAttribute("key",Integer.valueOf(key.toString())+1);
}
System.out.println(servletContext.getAttribute("key"));
(3)获取项目发布路径
getRealPath("/");
//获取项目发布路径
ServletContext application = this.getServletContext();
String path = application.getRealPath("/");
//E:\Code\apache-tomcat-9.0.0.M10\webapps\1_servlet5\
System.out.println(path);
在Servlet对象创建出来之后,搭配每一个Servlet对象,会伴随着一个ServletConfig对象的产生.
Servlet对象是我们要用的对象,ServletConfig对象是用来装饰Servlet对象的配置对象.
Servlet对象就相当于人,ServletConfig对象相当于衣服.
先有Servlet对象,后有ServletConfig对象
该对象在实际项目中没有什么作用,在开发框架时会用到
/*
* ServletConfig对象的取得:
* ServletConfig config = this.getServletConfig();
* 变量名:config
*/
@Override
public void init(ServletConfig config) throws ServletException {
//创建ServletConfig对象的过程
super.init(config);
}
(1)获得web.xml中配置的servlet-name
getServletName()
ServletConfig config = this.getServletConfig();
String sname = config.getServletName();
System.out.println(sname);//指定的name
(2)根据key获取value
getInitParameter(String key)
配合web.xml中的配置(注意配置在servlet-class的下方)
<servlet-mapping>
<servlet-name>myHttpServletservlet-name>
<url-pattern>/test2url-pattern>
servlet-mapping>
<servlet>
<servlet-name>myHttpServletservlet-name>
<servlet-class>com.yunhe.servlet.myHttpServletservlet-class>
<init-param>
<param-name>usernameparam-name>
<param-value>zhangsanparam-value>
init-param>
servlet>
ServletConfig servletConfig = this.getServletConfig();
String username = servletConfig.getInitParameter("username");//获取当前servlet指定配置的数据
System.out.println(username);