servlet
servlet是一门开发多态web的技术
一、实现servlet程序
创建maven父子工程
把之后的maven项目当作父工程的模块使用
- 创建父工程:创建一个maven空项目,之后把src目录删掉。当作父工程使用,把依赖包安装在父工程的pom.xml,子工程可以使用
- 在父工程中创建maven模块
子工程创建一个Servlet程序
在java目录下,创建一个继承HttpServlet的类
package com.szz.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doGet方法");
PrintWriter writer = resp.getWriter();
writer.print("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, ServletException {
doGet(req,resp);
}
}
此时由于没有HttpServlet,会报错,安装其依赖即可。本人这里安装依赖后一直报找不到
javax.servlet
。我的解决方法:
- 使用tomcat的Servlet-api
<dependency>
<groupId>tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>5.5.23</version>
</dependency>
设置映射,在web.xml文件中设置servlet映射
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.szz.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
此时就可以运行tomcat了,在路径后面拼接
/hello
,就可以读到com.szz.servlet.HelloServlet
类下设置的doGet方法的响应内容。
二、ServletContext对象
ServletContext是上下文对象,可以使servlet之间进行数据的共享
数据共享
例子:
设置属性,供别的servlet获取
package com.szz.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
/*
* 该类通过ServletContext上下文设置属性,供其他Servlet类使用
* */
public class SetData extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取servletcontext
ServletContext context = this.getServletContext();
//设置共享属性
String username="小明";
context.setAttribute("username",username);
//设置响应体的类型与编码
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().print("我共享的数据:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
获取上面共享的数据
package com.szz.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//该类通过ServletContext来获取共享的数据
public class GetData extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取共享的数据
ServletContext context = this.getServletContext();
String username =(String) context.getAttribute("username");
//设置响应体
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().print("我拿到的共享数据:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在web.xml文件中,设置好这两个类的映射
<servlet>
<servlet-name>setData</servlet-name>
<servlet-class>com.szz.servlet.SetData</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>setData</servlet-name>
<url-pattern>/setdata</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getData</servlet-name>
<servlet-class>com.szz.servlet.GetData</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getData</servlet-name>
<url-pattern>/getdata</url-pattern>
</servlet-mapping>
运行结果
获取初始化参数
在web.xml文件中添加参数代码
<!-- 设置初始化参数,不怎么用-->
<context-param>
<param-name>username</param-name>
<param-value>sister</param-value>
</context-param>
在servlet文件中来获取
String username = servletContext.getInitParameter("username");
package com.szz.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doGet方法");
ServletContext servletContext = this.getServletContext();
//获取初始化参数
String username = servletContext.getInitParameter("username");
PrintWriter writer = resp.getWriter();
writer.print("Hello Servlet"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, ServletException {
doGet(req, resp);
}
}
读取资源文件
项目打包后都放在classes,我们称为classpath
资源文件
username=toney
读取资源文件
package com.szz.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
//读取资源文件
public class Servlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取资源文件
InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/test.properties");
Properties properties = new Properties();
properties.load(inputStream);
//获取资源文件的属性
String username = properties.getProperty("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().print("资源文件的内容username:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
三、HttpServletResponse对象
响应对象,设置发给客户端的响应头部以及响应内容
方法名 | 描述 | 例子 |
---|---|---|
void sendRedirect(String var1) throws IOException; | 设置重定向resp.sendRedirect(“/项目根路径/跳转的页面(或路由)”),不加项目根路径会报错 | 假设项目启动路径是localhost:8080/r ,resp.sendRedirect(“/r/跳转的页面(或路由)”) |
void setHeader(String var1, String var2); | 设置响应体头部信息,比如设置编码,文件类型等等 | resp.setHeader(“Content-Type”,“text/html;charset=UTF-8”) |
int getStatus(); | 获取状态码 | |
void addCookie(Cookie var1); | 添加cookie | resp.addCookie(new Cookie(“name”,“value”)) |
四、HttpServletRequest对象
接受客户端传过来的信息
方法名 | 描述 | 例子 |
---|---|---|
String getParameter(String var1); | 拿指定的name获取value;这个name与前端做好约定 | req.getParameter(“username”); |
String[] getParameterValues(String var1); | 拿指定的name获取多个value;这个name与前端做好约定,比如复选框 | req.getParameter(“checkbox”); |
Cookie[] getCookies(); | 获取客户端携带过来的cookie信息 | req.getCookies() |
HttpSession getSession(); | 获取客户端的session | req.getSession() |
五、编码解码
有时候数据出现乱码,可以通过编码解码的方式解决(只是其中一种)
URLEncoder.encode("实打实打算","UTF-8");//编码
URLDecoder.decode("编码的对象","UTF-8");//解码