目录
1、Servlet简介
2、代码实现
2.1、环境准备
2.2、实现servlet接口
2.3、配置web.xml文件
2.4、url-pattern的三种配置方式
2.5、快速创建Servlet
2.6、修改快速创建模版(针对以上模版不一致或者webServlet中请求路径没有/)
3、项目部署位置(面试题)
4、绝对路径和相对路径
4.1、绝对路径
4.2、相对路径
5、ServletConfig和ServletContext
5.1、ServletConfig
5.2、ServletContext
5.3、两者区别
1、Servlet简介
Servlet 是sun公司提供的一门用于开发动态web资源的技术 Servlet 是基于Request Response编程模型 Sun公司在其API提供了一个servlet接口,用户若想开发一套动态的web项目,需要完成以下2步骤:
1、编写一个java类,实现servlet接口。
2、把开发好的程序布署到服务器中。
servlet的作用:
1、接受浏览器发送过来的消息。
2、给浏览器返回消息,浏览器认识html,可以动态去输出html。Request:请求。客户端向服务端发送的信息。
Response:响应。服务器向客户端发送的信息。
通常请求和响应是成对出现的。
2、代码实现
2.1、环境准备
在实现servlet之前,我们需要配置一下tomcat,因为tomcat里面有servlet相关jar包,如果不导入tomcat,那么servlet的方法是不能被使用的。
在idea右上角有个Edit Configurations选项,点击打开
选择Templates,往下寻找Tomcat Server
找到Tomcat Server,选择Local(本地)
点击右上角有个Configure按钮,点击打开
在下面的选框中导入Tomcat的路径后点击OK。
把JRE框中选择使用你电脑安装的JDK,这里我用的是JDK1.8。
点击Apply后OK。
之后,点击左上角加号
找到Tomcat Server,并点击Local
点击Deployment后点击后边的+号,
选择Artifact添加项目
出现以下画面就代表添加成功,建议把下面的Application context请求路径改为/
首先创建一个web项目,然后创建一个servlet包用来存放servlet类
创建第一个Servlet类
2.2、实现servlet接口
public class MyServlet implements Servlet {
//servlet初始化方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("==========servlet init===========");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//业务方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("=============servlet service============");
//servletRequest对象强转为HttpServletRequest对象
HttpServletRequest request=(HttpServletRequest) servletRequest;
String username = request.getParameter("username");
System.out.println(username);
}
@Override
public String getServletInfo() {
return null;
}
//servlet销毁方法
@Override
public void destroy() {
System.out.println("==========servlet destroy===========");
}
}
写好这个servlet类就能够完成了吗,还不行,需要进行配置web.xml文件
2.3、配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp/xml/ns/javaee"
xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp/xml/ns/javaee http://xmlns.jcp/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<!--servlet-name填写servlet类名-->
<servlet-name>MyServlet</servlet-name>
<!--servlet-class填写servlet类的路径-->
<servlet-class>cn.itssl.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--注意:这里的name名必须与上面servlet标签内的name名一致-->
<servlet-name>MyServlet</servlet-name>
<!--请求地址,这里推荐使用/类名-->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
启动Tomcat服务器
在浏览器地址栏中输入localhost:8080/MyServlet,注意:这里8080后面的内容就是配置文件url-pattern标签写的内容
可以看到,点击回车后,idea控制台输出了我在初始方法和service方法中写的输出语句,servlet被成功的初始化了,后面是null是因为我在地址栏没有提交一个参数,所以获取到的是null,现在我提交一个参数username看看效果
可以看到service方法又被调用了,而且参数username也被输出到了控制台。可以发现初始化方法只被执行了一次,后面再提交就不会调用了。
2.4、url-pattern的三种配置方式
1、完全路径匹配,以”/”开头 后面是具体的路径信息。
你输入什么内容。访问的时候,就需要输入什么内容,才可以找到对应的servlet
例如
<url-pattern>/hello</url-pattern>
2、目录匹配,以/*结尾
<url-pattern>/*</url-pattern>
http://ip:端口/abc/abx
http://ip:端口/abc/bdsf
3、扩展名匹配 *.扩展名 注意: *.扩展名(正确) /*.扩展名(错误)
<url-pattern>*.do</url-pattern>
<url-pattern>*.action</url-pattern>
*.do
*.action
2.5、快速创建Servlet
重写Servlet虽然能够获取request与response对象获取参数,但是还必须每次都得进行强转,而且重写方法里面只有service方法会被用到,其他方法大部分是用不到的,那么我们需要去快速创建一个简洁方便的servlet类。借助idea开发工具可以快速的创建servlet
1、自己去定义的servlet 只需要继承HttpServlet 就可以实现 servlet的接口了。
2、以后处理用户的请求,都写在doGet或者doPost方法中。
在新建里面找到servlet选项
只需要修改名字就可以,其他路径都不用动,修改完名字点击OK。
这个模版里面使用了注解形式设置请求路径,所以就不用在web.xml配置文件中设置servlet以及servlet-mapping标签了。
@WebServlet(urlPatterns = "/RegisterServlet")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
System.out.println("用户名:"+username+" 密码:"+pwd);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.6、修改快速创建模版(针对以上模版不一致或者webServlet中请求路径没有/)
如果出现以上模版中不一样,或者说请求路径是name=xxxx,没有/的情况,那么跟着一下操作进行修改模版
点击File中的Settings设置
点击Editor,找到File and Code Templates,在右侧面板中找到Other,找到Web点击后Java code templates,找到Servlet Annotated Class.java
把以下代码放入到模版框内
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet(urlPatterns="/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
this.doPost(request,response);
}
}
3、项目部署位置(面试题)
我们思考一个问题,tomcat里面如何部署一个项目,肯定是放在了tomcat里面的webapps,那我们去项目中找一下
发现并没有项目的包,那么就很疑惑,没有放到tomcat的webapps中,项目是怎么在tomcat中跑起来的呢?
其实真正的项目是在C:\Users\Administrator\.IntelliJIdea2018.3\system\tomcat\Tomcat_9_0_54_day02_servlet\conf\Catalina\localhost\ROOT.xml
context标签中的docBase的作用就是从此路径寻找项目
可以看到,打开这个路径,找到了我们项目写的web下的页面
然而java代码就被放在了WEB-INF的classes包中
4、绝对路径和相对路径
4.1、绝对路径
在html里,我们需要通过form表单请求到后台,action中的地址就是我们发送请求到的servlet地址,这里可以使用绝对地址,顾名思义,就是整个地址都得写上
<form action="http://localhost:8081/ServletDemo" method="post">
</form>
4.2、相对路径
相对路径就只用写上servlet中的请求路径
<form action="/ServletDemo" method="post">
</form>
5、ServletConfig和ServletContext
5.1、ServletConfig
servletConfig 是一个对象。javaee规范中定义的一个对象。要求web服务器(tomcat),创建一个servlet的同时,也要去创建一个servletConfig对象。还要给servlet去使用。
serlvetConfig 是我们servlet 一些的配置信息。如果一个servlet 使用的过程中需要一些参数信息。这些参数信息,可以配置到servletConfig中。 之后servlet去使用。
<servlet>
<servlet-name>ServletConfig01</servlet-name>
<servlet-class>cn.itssl.config.ServletConfig01</servlet-class>
<!--给当前servlet配置一些参数-->
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfig01</servlet-name>
<url-pattern>/ServletConfig01</url-pattern>
</servlet-mapping>
原生配置xml方式
public class ServletConfig01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//通过servletConfig对象获取到web.xml下配置的参数内容
String charset = servletConfig.getInitParameter("charset");
System.out.println(charset);
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
通过注解形式
@WebServlet(urlPatterns = "/ServletConfig02", initParams = {@WebInitParam(name = "charset", value = "utf-8"), @WebInitParam(name = "charset2", value = "GBK")})
public class ServletConfig02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String charset = this.getServletConfig().getInitParameter("charset");
response.setContentType("text/html;charset="+charset);
//如果不设置字符集在页面会出现乱码
response.getWriter().write("我爱你中国");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
5.2、ServletContext
在ServletConfig对象中可以看出该对象只能为当前servlet进行参数赋值,也就是说每一个servlet的参数都是独立的,如果以后有上百个servlet都要为其赋值charset字符集,那么重复的设置是很繁琐的,所以ServletContext就可以解决这个问题,它是全局设置参数。
ServletContext是整个web项目应用程序运行后的代表对象。(代表当前一个项目)可以通过ServletConfig的getServletContext() 的方法得到,然后可以用该对象取得整个应用程序的相关资源或者信息。
<!--配置全局参数,所有的servlet都可以进行访问-->
<context-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</context-param>
@WebServlet(urlPatterns = "/ServletContext01")
public class ServletContext01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String charset = this.getServletContext().getInitParameter("charset");
response.setContentType("text/html;charset="+charset);
response.getWriter().write("我爱你中国");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
5.3、两者区别
ServletConfig:
一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet
有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
ServletContext:
对任何servlet,任何人在任何时间都有效,等于是全局的对象。
更多推荐
Servlet快速入门
发布评论