下载并配置Tomcat服务器
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.44/bin/apache-tomcat-9.0.44-windows-x64.zip
然后解压放在一个目录下,再集成到idea中:
Run->Edit Configurations->Templates->Tomcat Server->Local
然后点击Configure:
选择Tomcat Home的路径:
修改路径:
这个路径是默认的url前缀,例如你的接口是/demo
,映射就会自动变成context+/demo
创建Java EE项目
New->Project->Java Enterprise
然后勾选Web Application
文件说明:
- src是我们写业务逻辑的地方
- web文件夹下是我们写页面的地方
页面是jsp格式文件,但jsp语法很容易上手,大体与HTML没啥区别
首次运行:
点击右上角的Run
系统会自动打开浏览器
页面效果如下:
项目开发流程
- 创建JavaEE项目
- 定义一个类,实现Servlet接口,实现接口中的抽象方法,业务逻辑写在
service
方法中 - 或者是继承HttpServlet类,重写
doGet
、doPost
等方法 - 使用注解,使得url和类映射(或者是web.xml中配置Servlet,但是不推荐)
@WebServlet(urlPatterns = "/demo")
public class Test implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//something
}
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<!-- 配置servlet,起别名为demo-->
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>controller.Test</servlet-class>
</servlet>
<!-- 进行url关系映射,当访问/demo时,demo这个类反馈-->
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
Servlet获取请求信息
获取参数通用方式(get、post都可用)
- String getParameter(String name):根据参数名称获取参数值
- String[] getParameterValuers(String name):根据参数名称获取数组
- Enumeration<String> getParameterNames():获取所有请求参数的名称
- Map<String ,String[]> getParameterMap():获取所有参数的map集合
@WebServlet(urlPatterns = "/demo")
public class Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println(username);
}
}
post请求会遇到中文乱码问题,方法第一行加上这句话就好了:
req.setCharacterEncoding("utf-8");
请求转发
浏览器的地址没发生变化,是服务器内部资源跳转的方式,而不能跳转到外部请求
req.getRequestDispatcher("/path").forward(req,resp);
共享数据
- req.setAttribute(String name, Object obj):存储数据
- Object req.getAttribute(String name):获取数据
- req.removeAttribute(String name):删除数据
获取ServletContext对象
后面再说
BeanUtils工具类
BeanUtils工具常用工具类有两个:BeanUtils、ConvertUtils。BeanUtils用于封装数据,ConvertUtils用于处理类型转换
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
- BeanUtils.copyProperties(p,d); 把q的值拷贝给p
- populate(Object bean, Map<String,String[]>properties) :将map封装到bean中
Servlet传数据给jsp
Response对象
重定向
- 页面的url会发生改变
- 可以访问其他站点(非本项目)的服务资源
- 是两次请求,不可用request共享数据
resp.sendRedirect("/path");
//或者是使用这两句
//resp.setStatus(302);
//resp.setHeader("location","/path");
字符流传到页面
//设置Tomcat编码形式
resp.setCharacterEncoding("utf-8");
//设置页面解码形式
resp.setContentType("charset=utf-8");
//写内容到页面
PrintWriter writer = resp.getWriter();
writer.write("<h1>你好呀</h1>");
字节流到页面(画验证码)
可以在页面创建一个img标签,src写这个接口地址
int width = 100;
int height = 50;
//创建对象,内存中的图片
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
//美化图片
//2.1填充背景色
Graphics g = image.getGraphics();
g.setColor(Color.PINK);
g.fillRect(0,0,width,height);
//2.2画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
//随机角标
Random random = new Random();
for (int i = 0; i < 4; i++) {
int index = random.nextInt(str.length());
//写验证码
g.drawString(String.valueOf(str.charAt(index)),width/5*i,height/2);
}
//画干扰线
g.setColor(Color.GREEN);
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
//输出到页面
ImageIO.write(image,"jpg",resp.getOutputStream());
ServletContext对象
代表整个web程序
获取ServletContext对象
- 使用
requests.getServletContext()
获取 - 如果继承了HttpServlet可以使用
this.getServletContext()
获取
获取类型
context.getMimeType()
域对象
用的很少,因为范围很大,共享所有用户的信息
- setAttribute(String name, Object obj):存储数据
- getAttribute(String name):获取数据
- removeAttribute(String name):删除数据
获取文件路径
context.getRealPath()
- WEB-INF下的文件可以写成
context.getRealPath(/WEB-INF/xxx)
- src目录的文件会被放在
WEB-INF/classes
下
文件下载
public class Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求参数,文件名称
String filename = req.getParameter("filename");
//字节输入流加载文件进内存
//2.1找到文件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//2.2用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//3.设置response的响应头
//3.1设置响应头类型
String mimeType = servletContext.getMimeType(filename);
resp.setHeader("content-type",mimeType);
//3.2设置响应头打开方式
resp.setHeader("content-disposition","attachment;filename="+filename);
//4.将输入流的数据写出到输入流中
ServletOutputStream sos = resp.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
sos.write(bytes,0,len);
}
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}