<!--动态程序Servlet的配置-->
<!--告诉Tomcat容器,由一个Servlet程序-->
<servlet>
<!--Servlet的内部名称-->
<servlet-name>Index</servlet-name>
<!--Servlet的类名,全限定名-->
<servlet-class>com.xunpu.IndexServlet</servlet-class>
</servlet>
<!--Tomcat将通过反射实例化一个Servlet对象。-->
<!--Servlet的映射关系,告诉Tomcat容器,当用户请求一个地址的时候,使用该Servlet处理。-->
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/IndexServlet</url-pattern>
</servlet-mapping>
一、JavaWeb简介
1.Web简介
Web程序是一种可以通过浏览器访问的应用程序。Web应用的一个最大好处是用户只需要有浏览器即可访问应用程序,无需安装其它软件。电商网站如淘宝、京东、新浪、网易等都属于Web应用程序。
2.B/S模型
B/S模型也称为浏览器-服务器模型。对应的是C/S模型即客户端-服务器模型。
B/S模型的优点:
a.具有分布式特点,可以随时随地进行查询、浏览等业务处理。
b.业务扩展简单方便,通过增加网页即可增加服务功能。
c.维护简单方便,只需要更改网页,即可实现所有用户的同步更新。
d.开发简单,共享性强。
3.动态Web
web服务器只能向客户提供静态资源,但是我们所见到地网站都不可能是静态网页。要想呈现出多姿多彩的网页,就需要动态Web技术了。
3.1 Web服务器
Web服务器是“通过HTTP协议处理请求的计算机系统”,擅长提供静态的Web页面,而不做动态内容和不再服务器上保持数据,而此时如果我们需要一个动态的页面就需要一些辅助程序来完成。
常用的主流Web服务器有:
Nginx
Apache HTTP Server
Apache Tomcat侧重点在Web页面
3.2 动态技术
CGI(Common Gateway Interface):公共网关接口
PHP(HyperText Preprocessor):超文本处理器
ASP(Active Server Page):活动服务器页面
JSP(Java Server Pages):Java服务器页面,其是简化的Servlet涉及
4.Servlet简介
Servlet是Java Servlet的简称,称为小服务程序,即用Java编写的服务端程序。主要功能在于交互式地浏览和修改数据,生成动态web内容。狭义地Servlet是Java语言实现的一个接口,广义的Servlet是指任何实现了Servlet接口的类。
4.1 优势
方便:Servlet提供了大量的实用工具例程(自动解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话)。
功能强大:能够直接与Web服务器进行交互,而普通的CGI程序则不能。Servlet还能在各程序之间共享数据,使得数据库连接池之类的功能很容易实现。
可移植性好。
4.2 架构
Servlet中是没有main()的,它受控于另外一个Java应用,这个应用称为容器。
4.3 Servlet的任何和规范
任务:
1.读取客户端(浏览器)发送的显式的数据。比如:网页上的HTML表单,自定义的HTTP客户端程序的表单。
2.读取客户端(浏览器)发送的隐式的HTTP请求数据。比如:cookies、媒体类型、浏览器能理解的压缩格式等。
3.处理数据并生成结果。这个过程可能需要访问数据库;执行业务逻辑;调用Web服务,或者直接计算得出对应的响应数据。
4.发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML或XML)、二进制文件(GIF图像)、Excel等。
5.发送隐式的HTTP响应到客户端(浏览器)。这包括告诉浏览器或其它客户端被返回的文档类型(例如HTML),设置cookies和缓存数据,以及其它类似的任务。
规范:
Java SE :JLS Java语法规范、JVMLS Java虚拟机规范
Java EE:Java Servlet API、Restfull API、JSON API JPA持久化API、EJB、XML API、WebSocket
4.4 Tomcat目录
/bin:各种操作系统下用于启动和停止Tomcat的命令文件
/conf:存放Tomcat服务器各种配置文件
/lib:存放Tomcat服务器依赖的Jar文件
/logs:存放Tomcat的日志文件。
/temp:存放Tomcat运行时的临时文件。
/webapps:发布web应用时,默认会将web应用发布到此目录中。
/work:Tomcat把由JSP生成的Servlet放于此目录中。JSP-->java类-->CLASS文件
4.5 创建Java web项目的流程
1)创建Maven的Web项目(java html/css//js)
2)配置pom.xml
3)配置web.xml文件
4)静态代码(html/css/javascript)
5)动态代码(Java)
二、通过Servlet实现前端打印Maven目录
package com.xunpu;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
/**
* 1.指定发送数据的编码和内容类型
* 2.通过req获取name属性,进而得到仓库的地址。
* 3.定义一个StringBuilder对象sb,用于编写前端代码。
* 4.通过仓库地址创建指定目录,并通过该目录的listFiles()得到File[]。
* 5.如果File[]对象不为空,则依次遍历每个文件并组织相应的超链接。如果为空,则输出"暂无数据".
* 6.最后通过resp写回sb,在前端展示。
* 注意:多级目录下,浏览器并不识别文件分隔符,因此在写超链接的时候可以用特殊字符"_"代替,而在取的时候再替换为文件分隔符。
*/
public class MavenList extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String repository;
//指定发送数据的编码和内容类型
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");//文本类型的html文件
String name=req.getParameter("name");//根据跳转的URL获取name属性值
//将"_"替换为文件分割:浏览器HTTP协议不支持文件分隔符,所以替换为"_"
if(name==null||name.isEmpty()){
repository="E:"+File.separator+"Maven"+File.separator+"repository";//设置为当前仓库的根目录
}else{
repository="E:"+File.separator+"Maven"+File.separator+"repository"+File.separator+name.replace("_",File.separator);//取的时候要变一下“_"--"/"
}
StringBuilder sb=new StringBuilder();
//前端页面
// 根据数据编写网页html代码
sb.append("<html>").append("<head>").append("<title>").append("Maven目录").append("</title>").append("/head");
sb.append("<body>");
sb.append("<a href='>").append("..").append("'>").append("..").append("</a>").append("<br>");
//遍历指定目录
File directory=new File(repository);
File[] list=directory.listFiles();
if(list!=null){
for(File f:list){
String filename=f.getName();
//请求地址 http://localhost:8089/maven?name=commons-cli
//name=name1+"/"+name2 -->浏览器不允许出现"/"(File.separator),用"_"代替,取的时候再变
String nextName=(name==null||name.isEmpty())?filename:name+"_"+filename;//存
sb.append("<a href='").append("maven?name=").append(nextName).append("'>").append(filename).append("</a>").append("<br>");//如果name属性不为空,则拼接在后面,便于下次访问。
}
}else{
sb.append("暂无数据");
}
sb.append("</body>").append("</html>");
// 输出到浏览器端
resp.getWriter().write(sb.toString());
resp.getWriter().flush();
}
}
在webapp/WEBINF/web.xml中配置:
<servlet>
<servlet-name>MavenList</servlet-name>
<servlet-class>com.xunpu.MavenList</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MavenList</servlet-name>
<url-pattern>/maven</url-pattern>
</servlet-mapping>
结果展示:
通过web.xml传入本地maven仓库路径,在web.xml中配置:
<servlet>
<servlet-name>MavenList</servlet-name>
<servlet-class>com.xunpu.MavenList</servlet-class>
<init-param>
<param-name>reposity</param-name>
<param-value>E:\Maven\repository</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MavenList</servlet-name>
<url-pattern>/maven</url-pattern>
</servlet-mapping>
package com.xunpu;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
public class MavenList extends HttpServlet {
private String reposity;
@Override
public void init(ServletConfig config) throws ServletException {
super.init();
reposity=config.getInitParameter("reposity");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String repository;
//指定发送数据的编码和内容类型
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");//文本类型的html文件
String name=req.getParameter("name");//根据跳转的URL获取name属性值
//将"_"替换为文件分割:浏览器HTTP协议不支持文件分隔符,所以替换为"_"
if(name==null||name.isEmpty()){
repository=reposity;//设置为当前仓库的根目录
}else{
repository=reposity+File.separator+name.replace("_",File.separator);//取的时候要变一下“_"--"/"
}
StringBuilder sb=new StringBuilder();
//前端页面
// 根据数据编写网页html代码
sb.append("<html>").append("<head>").append("<title>").append("Maven目录").append("</title>").append("/head");
sb.append("<body>");
sb.append("<a href='>").append("..").append("'>").append("..").append("</a>").append("<br>");
//遍历指定目录
File directory=new File(repository);
File[] list=directory.listFiles();
if(list!=null){
for(File f:list){
String filename=f.getName();
//请求地址 http://localhost:8089/maven?name=commons-cli
//name=name1+"/"+name2 -->浏览器不允许出现"/"(File.separator),用"_"代替,取的时候再变
String nextName=(name==null||name.isEmpty())?filename:name+"_"+filename;//存
sb.append("<a href='").append("maven?name=").append(nextName).append("'>").append(filename).append("</a>").append("<br>");//如果name属性不为空,则拼接在后面,便于下次访问。
}
}else{
sb.append("暂无数据");
}
sb.append("</body>").append("</html>");
// 输出到浏览器端
resp.getWriter().write(sb.toString());
resp.getWriter().flush();
}
}