Servlet简介
Servlet就是sun公司开发动态web的一门技术
Sun在这些API中提供一个接口叫做: Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
编写一个类,实现Servlet接口
把开发好的JAVA类部署到Web服务器中.
把实现了Servlet接口的Java程序叫做,Servlet
Servlet接口Sunday公司有两个默认的实现类:HttpServlet,GenericServlet
编写一个Servlet程序
1.编写一个普通类
2.实现Servlet接口,这里我们直接继承HttpServlet
public class HelloServiet extends HttpServlet { //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter();//回应流 writer.print("hello,servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
编写Servlet的映射
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;
web容器指tomcat服务器
注意:URL路径的/
Mapping问题
1.一个Servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
2.一个Servlet可以指定多个映射路径
<!--servlet请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping>
都可以访问到
3.一个Servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4.默认请求路径
<!--默认请求路径-->
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
随便输入任何内容都可以进入
5.指定一些后缀或者前缀等等...
<!--可以自定义后缀实现请求映射 注意点: *前面不能加任何内容,如/-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do/url-pattern>
</servlet-mapping>
6.优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;|
servletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
`共享数据
`在这个Servlet中保存的数据,可以在另外一个servlet中拿到;
放置数据的类
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("hello"); ServletContext servletContext = this.getServletContext(); String username="头秃"; servletContext.setAttribute("username",username);//将一个数据保存在:了ServletContext中,名字为: username 值 username }
读取数据的类
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); String username = (String) servletContext.getAttribute("username"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字="+username); }
一次写两个参数的方法resp.setContentType("text/html;charset=utf-8");
获取初始化参数
在xml中配置
<!--配置一些web应用初始化参数--> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://127.0.0.1:3306/mybatis</param-value> </context-param>
使用
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { final ServletContext servletContext = this.getServletContext(); String url = servletContext.getInitParameter("url");//获取初始化的参数,可以变为一个字符串 resp.getWriter().print(url); }
测试运行
读取资源文件
Properties
`在java目录下新建properties
`在resources目录下新建properties
`发现:都被打包到了同一个路径下: classes,我们俗称这个路径为classpath;
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
第一个'/'代表当前web应用
思路:需要一个文件流
读取db.properties配置文件
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties prop = new Properties(); prop.load(is);//流 String user = prop.getProperty("username");//获取属性 String pwd = prop.getProperty("password");//获取属性 resp.getWriter().print(user+":"+pwd); }
去webapp下做一个映射
运行结果
HttpServletResponse 响应
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
`如果要获取客户端请求过来的参数:找HttpServletRequest
`如果要给客户端响应一些信息:找HttpServletResponse
简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;//写平常的流用 PrintWriter getWriter() throws IOException;//写中文用
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);//设置响应的编码 void setContentLength(int var1);//设置响应的字符串长度 void setContentLengthLong(long var1);//设置长度 void setContentType(String var1);//设置类型
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
2.下载文件
1.向浏览器输出消息
2.下载文件
1.要获取下载文件的路径
2.下载的文件名是啥?
3.设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西
4.获取下载文件的输入流
5.创建缓冲区
6.获取OutputStream对象
7.将FileOutputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区中的数据输出到客户端!
// 1.要获取下载文件的路径 String realPath = "D:\\IDEA项目\\Maven项目\\servlet-01\\response\\src\\main\\resources\\niao.jpg"; System.out.println("下载的路径:"+realPath); // 2.下载的文件名是啥? String filename = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3.设置想办法让浏览器能够支持下载我们需要的东西 resp.setHeader("Content-disposition","attachment;filename="+filename); // 4.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); // 5.创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; // 6.获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); // 7.将FileOutputStream流写入到buffer缓冲区 while ((len=in.read(buffer))>0){ out.write(buffer,0,len); } out.close(); in.close(); // 8.使用OutputStream将缓冲区中的数据输出到客户端! }
如果文件名是中文
// 3.设置想办法让浏览器能够支持下载我们需要的东西,中文文件名URLEncoder.encode编码,否则可能会乱码 resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
不过不建议使用中文名
HttpServletRequest 请求