Servlet学习
目录
Servlet
Servlet简介
- servlet是sun公司开发的一款用来实现动态web的技术
- 这个动态web技术提供了一个接口:Servelt
- 想要使用,只需要编写一个类去实现这个接口即可
Servelt的使用
Maven父子工程
- 父亲导入的jar包子项目也可以使用
- 子项目无法使用父项目
Maven环境优化
1、pom.xml中添加依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<!--作用域 <scope>provided</scope>-->
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
2、修改 web.xml 为最新版
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
</web-app>
3、maven结构搭建完整
- main
- java
- resources
- webapp
directory(目录)
resources(资源)
第一个Servlet程序(Hello Servlet )
步骤 1、
-
创建一个空的maven工程
-
创建javaclass文件
-
继承HttpServlet类
-
重写doGet和doPost方法
public class HelloServlet extends HttpServlet {
//由于get和post方法只是请求实现的方式不同,所以可以相互调用,业务逻辑是一样的
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.println("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
步骤 2、
编写web.xml文件中注册Servelt 和 Servlet请求路径
<servlet>
<!--servlet名称-->
<servlet-name>hello</servlet-name>
<!--servlet地址-->
<servlet-class>com.ben.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--请求的servlet名称-->
<servlet-name>hello</servlet-name>
<!--访问路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
ErrorServlet
修改404报错界面
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");//使用html格式显示
resp.setCharacterEncoding("UTF-8");//使用UTF-8编码
PrintWriter writer = resp.getWriter();
writer.println("<h1>错误</h1>");
}
Servlet 的使用
ServletContext
1、能够实现数据的共享
在不同的servlet中想要实现数据的交互就需要使用context,context是作用与项目所有servlet之上的
存储数据 setAttribute(“数据名称”,数据内容)
读取数据 getAttribue(“数据名称”,数据内容)
例、
在一个servlet中保存数据到context中,再在另一个servlet中获取数据后使用并显示
SetServlet
public class SetContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getServletContext() 获取当前的上下文
ServletContext context = this.getServletContext();
String name = "张三";
//将数据存储到context中
context.setAttribute("username",name);
}
}
GetServlet
public class GetContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//从context中获取数据
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("名字:"+ username);
}
}
2、能够获取初始化参数
获取xml文件的初始化参数
方法名:getInitParameter()
编写xml文件中需要获取的初始化参数
<!--初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
Servlet 中使用context获取
使用的是context中的getInitParameter方法
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//init (初始化) parameter(参数)
String url = context.getInitParameter("url");
System.out.println("url" + url);
resp.getWriter().println(url);
}
}
3、能够请求转发
地址不会改变的去获取其他页面数据
方法名: getResponseDispatcher()
方法名:getResponseDispatcher(“访问地址”).forward(req,resp)
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取当前上下文
ServletContext context = this.getServletContext();
// RequestDispatcher requestDispatcher = context.getRequestDispatcher("/sul");
// requestDispatcher.forward(req,resp);
context.getRequestDispatcher("/url").forward(req,resp);
}
}
4、能够获取资源文件中的资源
方法名: getResourceAsStream(“资源路径”)
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//使用Properties读取资源文件数据
Properties prop = new Properties();
prop.load(is);
String name = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().println("name:"+name);
resp.getWriter().println("password:"+pwd);
}
}
HttpServletResponse
1、简单分类
负责向浏览器发送数据分方法
//平常流
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、下载文件
获取下载文件的路径和需要下载的文件名称
让浏览器支持下载
设置下载文件的输入流
创建缓冲区
将输入流写到缓冲区中再下载到客户端
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 获取下载文件地址
String realPath = "C:\\Users\\86132\\IdeaProjects\\javeweb-servlet\\response\\src\\main\\resources\\1.png";
System.out.println("下载文件的路径为:"+realPath);
//2 获取下载文件的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\" + 1));
//3 设置浏览器支持下载该文件
resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
//4 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6 获取 OutputStream 对象
ServletOutputStream out = resp.getOutputStream();
//7 将输入流写入到缓冲区,再用OutputStream输出到客户端
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
3、重定向
重定向是能够改变路径的访问页面
resp.sendRedirect(“访问路径”)
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求
//从请求中获取参数
ServletContext context = this.getServletContext();
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username=" + username);
System.out.println("password=" + password);
//重定向
resp.sendRedirect("/r/success.jsp");
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<%--设置提交的路径,需要寻找项目的路径--%>
<%--${pageContext.request.contextPath}代表当前项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit">
</form>
</body>
</html>
HttpServletRequest
- HttpServletRequest 代表了客户端(用户)的请求
- 用户使用Http访问服务器,Http中的所有信息都会被封装在HttpServletRequest中
- 服务器就可以使用本类中的方法接收获取用户的信息(请求)
更多推荐



所有评论(0)