1.用IDEA创建web项目
在IDEA中直接点击 File -> New -> Project,
后面直接在左侧有个Java Enterprise
然后配置tomcat、java ee 7
下面列出的是组件,就是jar库,依赖其他的框架,
需要找到web appication ,选上。
创建完毕,然后开始学习会使用servlet教程。
创建完毕,这时候你打开项目中的External Libraries,会发现他自己就帮你把依赖的jar包导入进来了:
2个:JDK1.8 + Tomcat需要依赖的jar包
还有index.jsp 和web.xml
启动tomcat,访问localhost:8080就可以看到index.jsp页面的
内容了。
2.Servlet
代码:
第一部分:
HelloServlet
/**
* Author:林万新 lwx
* Date: 2017/11/11
* Time: 16:32
*/
public class HelloServlet implements Servlet {
//这个地方我明白了,我自己写的HelloServlet是实现了servlet接口,所以拥有它的所有资源,而ServletConfig
//是servlet的,或者更上层的东西;!
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("执行了init()...");
this.servletConfig = servletConfig;
System.out.println("config : <"+ servletConfig + ">");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("执行了service()...");
System.out.println("req: <" + servletRequest + ">, res: <" + servletResponse + ">");
servletResponse.getWriter().print("<h1>HelloServlet</h1>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("执行了destroy()...");
}
}
配置web.xml
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello.servlet.do</url-pattern>
</servlet-mapping>
解释:
1. url-pattern
<url-pattern/>用来指定Servlet的访问路径,必须以/开头.
可以在<servlet-mapping/>配置多个<url-pattern/>, 此时一个Servlet实例就绑定多个URL.
可以在<url-pattern/>中使用通配符*,可以使一个Servlet绑定一组URL, 但*不能出现在中间位置,也不能只有*通配符, 另外, 通配符只是一种模糊匹配URL的方式,如果存在更具体的<url-pattern/>,那么会优先选择精确匹配.
运行方式:
在浏览器上输入:http://localhost:8080/hello.servlet.do
结果显示:
浏览器内容:
HelloServlet
控制台内容:
执行了init()...
config : <org.apache.catalina.core.StandardWrapperFacade@76a327cd>
执行了service()...
req: <org.apache.catalina.connector.RequestFacade@33a1b77d>, res: <org.apache.catalina.connector.ResponseFacade@15393b10>
如果关闭tomcat会显示:
执行了destroy()...
第2部分:
HttpServlet
代码:
HelloHttpServlet实例
/**
* Author:林万新 lwx
* Date: 2017/11/11
* Time: 17:24
*/
@WebServlet(name = "HelloHttpServlet", urlPatterns = "/hello_http_servlet.do")
public class HelloHttpServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost() ...");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() ...");
}
}
运行结果显示:
1)浏览器端 :
输入网址:http://localhost:8080/hello_http_servlet.do
显示什么也没有(因为没写)
2)控制台:
doGet() ...
说明执行了doget方法,来获得浏览器的请求
第3部分
HttpServletRequest例子
在第2部分的基础上加上:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() ...");
//下面开始使用方法中的参数:HttpServletRequest
String referer = request.getHeader("Referer");
String userAgent = request.getHeader("User-Agent");
composeResponse(referer,userAgent,response);
}
private void composeResponse(String referer,String userAgent,HttpServletResponse response) throws IOException {
response.setHeader("Content-Type", "text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
if (referer != null){
writer.print("<h1>来源地址: " + referer + "</h1>");
}
else {
writer.print("<h1>来自浏览器地址栏</h1>");
}
writer.print("<hr>");
writer.print("<h1>来源信息: " + userAgent + "</h1>");
}
在浏览器中运行结果:
来自浏览器地址栏
来源信息: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
第4部分
HttpServletResponse例子
第一个例子:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.sendError(404, "nothing!!");
response.setStatus(404);
}
运行结果:
可以看到浏览器显示:404错误,找不到网页
第2个例子
//设置重定向(302, Location)
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", "http://www.baidu.com");
}
运行结果显示:
在浏览器输入网址后,直接跳转到百度页面
HttpServletResponse还提供了另外一种重定向的方式, 直接使用sendRedirect()方法, 避免了以上的步骤
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("http://www.baidu.com");
}
第3个例子
字符响应流
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.print("<html>");
writer.print("<h1>content</h1>");
writer.print("</html>");
}
缓冲区
PrintWriter的默认缓冲区大小为8K, 因此当响应数据大小<8K时, 数据存放在缓冲区, 而不会立刻发送到浏览器, 直到Servlet执行结束,因此如果希望马上发送给浏览器, 需要调用Response的flushBuffer()方法手动刷新缓冲区.
第5部分
ServletConfig
在容器初始化Servlet时, 会将一个ServletConfig实例传给init()方法,其封装了@WebServlet/部署描述符传递给Servlet的配置信息:
在helloservlet中使用
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("执行了init()...");
this.servletConfig = servletConfig;
//System.out.println("config : <"+ servletConfig + ">");
//在容器初始化Servlet时, 会将一个ServletConfig实例传给init()方法,其封装了@WebServlet/部署描述符传递给Servlet的配置信息:
Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println(name + "->" + value);
}
}
web.xml下配置
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>test.HelloServlet</servlet-class>
<init-param>
<param-name>admin</param-name>
<param-value>com.lwx</param-value>
</init-param>
<init-param>
<param-name>e-mail</param-name>
<param-value>1203631049@qq.com</param-value>
</init-param>
</servlet>
运行结果:
在控制台可以看到输出如下:
执行了init()...
admin->com.lwx
e-mail->1203631049@qq.com
第6部分
ServletContext
ServletConfig中提供了获取ServletContext的方法getServletContext(), ServletContext代表Servlet应用程序,且每个应用程序仅有一个ServletContext实例,其在容器启动时创建, 在容器关闭时销毁, 因此可以利用其在多个Servlet中传递数据.
所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:
例子
应用初始化参数
前面看到ServletConfig可以获取针对本Servlet的初始化参数,而利用ServletContext可以获取针对本应用程序的公共初始化参数:
在web.xml下配置
<context-param>
<param-name>admin</param-name>
<param-value>lwx</param-value>
</context-param>
<context-param>
<param-name>email</param-name>
<param-value>1203631049@qq.com</param-value>
</context-param>
在hellohttpservlet下
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() ...");
//
ServletContext context = getServletContext();
String admin = context.getInitParameter("admin");
String email = context.getInitParameter("email");
System.out.printf("admin %s%n",admin);
System.out.printf("email %s%n",email);
}
运行结果显示:
在控制台输出:
doGet() ...
admin lwx
email 1203631049@qq.com
获取资源
可以使用ServletContext来获取Web应用下的资源路径/资源流等内容: