Servlet
1、如何去书写一个servlet
2、如何去访问一个servlet
3、如何去快速创建一个servlet
4、web中一些路径的访问分析
5、servlet一些配置项(servletConfig)
6、web项目的配置项(servletContext)
servlet简介
Servlet 是sun公司提供的一门用于开发动态web资源的技术
Server:serv
let: applet 小程序; let
Servlet 是基于Request Response编程模型
Oracle公司在其API提供了一个Servlet接口,用户若想开发一套动态的web项目,需要完成以下2步骤:
1、编写一个java类,实现servlet接口
2、把开发好的程序布署到服务器中
servlet:1、接受浏览器发送过来的消息。
2、给浏览器返回消息。浏览器认识html。可以动态去输出html
Request:请求。客户端向服务端发送的信息。C->S
Response:响应。服务器向客户端发送的信息。S-C>
通常请求和响应是成对出现的。
作用:servlet 编写一个程序生成网页。
浏览器请求servlet,servlet会生产html。把html传送给浏览器(响应)。浏览器看到内容是html
servlet快速入门
实现步骤
写servlet做两件事
1、创建一个类来实现servlet接口。 由ORACLe公司定义的一个接口。(定义一个规范)
2、把项目部署到web服务器中(tomcat)。
sun公司定义一个servlet的规范。定义了servlet应该有哪些方法,以及方法需要的参数。
1、实现servlet接口(javax.servlet.Servlet)
2、重写service方法
当浏览器输入地址,访问servlet的时候,servlet会执行servcie方法。
3、在Web/WEB-INF/web.xml中配置servlet的路径 。浏览器访问servlet的路径
web.xml
代码实现
实现servlet 接口
/**
* @Auther: yanqi
* @Desc 写一个普通的类,实现servlet接口即可
*/
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("我是初始化init方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我是service方法,每一次请求都会响应");
//获取用户提交过来的数据
HttpServletRequest request = (HttpServletRequest)servletRequest;
String username = request.getParameter("username");
System.out.println(username);
//响应给浏览器
HttpServletResponse response = (HttpServletResponse)servletResponse;
response.getWriter().println("你刚刚输入的是:"+username);
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("我是destroy方法,挂掉");
}
}
配置请求路径
在web.xml中配置servlet的请求路径
<servlet>
<!--servlet的名字-->
<servlet-name>MyServlet</servlet-name>
<!--servlet所在的路径-->
<servlet-class>cn.yanqi.web.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--servlet的名写一定要于上面的名字保持一致-->
<servlet-name>MyServlet</servlet-name>
<!--servlet请求路径(地址)-->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
访问 servlet
启动tomcat服务器,面页访问
请求路径的分析
servlet的生命周期
servlet 什么时候出生,什么活动,什么销毁
1、当用户第一次访问servlet时,servlet会初始化,并且只初始化一次(init)
2、每一次请求都会走service方法
3、当服务器正常关闭,servlet销毁(destroy)
服务器启动配置
<servlet>
<!--servlet的名字-->
<servlet-name>MyServlet</servlet-name>
<!--servlet所在的路径-->
<servlet-class>cn.yanqi.web.MyServlet</servlet-class>
<!--配置servlet初始化时机,此时服务器启动时,servet就会初始化-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--servlet的名写一定要于上面的名字保持一致-->
<servlet-name>MyServlet</servlet-name>
<!--servlet请求路径(地址)-->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
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
也可以三种方式:
<url-pattern>/hello</url-pattern>
<url-pattern>/user/*</url-pattern>
<url-pattern>*.do</url-pattern>
servlet入门小结
1、创建一个类,去实现javax.servlet.Serlvet 这个接口(注意包不要导错)
2、重写类中 service方法
3、在web-inf/web.xml 中去配置serlvet一些信息
<servlet>
<!--servlet的名字-->
<servlet-name>MyServlet</servlet-name>
<!--servlet所在的路径-->
<servlet-class>cn.yanqi.web.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--servlet的名写一定要于上面的名字保持一致-->
<servlet-name>MyServlet</servlet-name>
<!--servlet请求路径(地址)-->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
快速创建servlet
实现步骤
借助开发工具可以快速的创建servlet
1、自己去定义的servlet 只需要继承HttpServlet 就可以实现 servlet的接口了。
2、以后处理用户的请求,都写在doGet或者doPost方法中。
/**
* @Desc 1、servlet 3.0以后的版本是可以直接使用注解开发,简化了手动配置servlet请求路径
* 2、@WebServlet( urlPatterns = "/ServletDemo") 等价于 我们在web.xml中配置
*/
@WebServlet(urlPatterns ="/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这个是post请求");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这个是get请求...");
}
}
什么时候走get请求?
----- 当指定为get请求时,浏览器默认走的get请求什么时候走post请求?
----- 指定为post请求时才会走post请求
修改servlet路径模版
当我们每一次创建完servlet之后都需要手动修改请求的路径,@WebServlet( name= “ServletDemo”)比较麻烦,
我们可以修改idea开发工具中的模版,下次再创建就不用再修改@WebServlet(urlPatterns = “/ServletDemo”)
web中的资源路径
如何去访问一个web中的资源
如果把hello.html放在WEB-INF下会发现无法直接访问。其实也可以访问,得通过后台访问,代码如下:
request.getRequestDispatcher(“WEB-INF/hello.html”).forward(request,response);
项目部署位置
我们把项目中的什么东西部署到tomcat中了?
这里是找tomcat部署的路径
C:\Users\你的用户名\.IntelliJIdeaxxx版\system\tomcat\Tomcat_8_5_33_12-servletDemo\conf\Catalina\localhost\ ROOT.xml
找到ROOT.xml中提示的路径即是项目部署的项目:
E:\Java\idea_workspase_20036\12-servletDemo\out\artifacts\12_servletDemo_war_exploded
我们发现部署是web下的所有资源:
把项目部署到tomcat中,到底把项目中的什么东西部署到tomcat中?
把所有web下的东西全部部署到tomcat了!!!!
请问src下java源代码在哪里了?
放在WEB-INF\classes
请求路径
绝对路径
localhost:8081,后期更换IP了,会出问题。
<form action="http://localhost:8081/ServletDemo" method="post">
</form>
相对路径
<form action="/ServletDemo" method="post">
</form>
servlet配置说明
servletConfig
servletConfig 是一个对象。javaee规范中定义的一个对象。要求web服务器(tomcat),创建一个servlet的同时,也要去创建一个servletConfig对象。还要给servlet去使用。
serlvetConfig 是我们servlet 一些的配置信息。如果一个servlet 使用的过程中需要一些参数信息。这些参数信息,可以配置到servletConfig中。 之后servlet去使用。
代码实现
方式一
<servlet>
<!--servlet的名字-->
<servlet-name>MyServlet</servlet-name>
<!--servlet所在的路径-->
<servlet-class>cn.yanqi.web.MyMVC</servlet-class>
<!--给当前servlet配置一些参数-->
<init-param>
<param-name>username</param-name>
<param-value>rose</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</init-param>
<!--配置servlet初始化时机-->
<load-on-startup>1</load-on-startup>
</servlet>
public class MyMVC implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet初始化");
//获取配置参数
String username = servletConfig.getInitParameter("username");
System.out.println(username);
}
}
方式二
initParams{@WebInitParam{},@WebInitParam{}}
@WebInitParam配置多个InitParam
name为InitParameter名字,value为值,之间用特殊符号隔开,这里用逗号。
@WebServlet(urlPatterns = "/ServletDemo" , initParams = {@WebInitParam(name = "charset",value = "utf-8")})
public class ServletDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("post");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
//获取ServletConfig
ServletConfig servletConfig = this.getServletConfig();
//获取参数
String username = servletConfig.getInitParameter("username");
System.out.println(username);
*/
//获取ServletConfig
ServletConfig servletConfig = this.getServletConfig();
//获取参数
String charset = servletConfig.getInitParameter("charset");
//设置响应字符集
//该句话一定是最上面,在中间输出有问题。
response.setContentType("text/html;charset="+charset);
response.getWriter().println("hello");
}
}
servletContext
ServletContext是整个web项目应用程序运行后的代表对象。(代表当前一个项目)可以通过ServletConfig的getServletContext() 的方法得到,然后可以用该对象取得整个应用程序的相关资源或者信息。
代码实现
<!--配置全局参数,所有的servlet都可以进行访问-->
<context-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</context-param>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext
ServletContext servletContext = this.getServletContext();
//获取参数
String charset = servletContext.getInitParameter("charset");
//设置响应字符集
response.setContentType("text/html;charset="+charset);
response.getWriter().println("我是小燕燕");
}
两者区别
ServletConfig:
一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
ServletContext:
对任何servlet,任何人在任何时间都有效,等于是全局的对象。
getServletContext();
//获取参数
String charset = servletContext.getInitParameter(“charset”);
//设置响应字符集
response.setContentType(“text/html;charset=”+charset);
response.getWriter().println(“我是小燕燕”);
}
## 两者区别
ServletConfig:
一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
ServletContext:
对任何servlet,任何人在任何时间都有效,等于是全局的对象。