Servlet 之超详解【2023年最新版】(三)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: Servlet 之超详解【2023年最新版】(三)

7.2 响应乱码

分类:

①获得输出流直接写数据

写法如下:

response.addHeader("Content-Type","text/html;charset=utf-8);
//简写
response.setContentType("text/html;charset=utf-8");

不信?请看如下演示:

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.PrintWriter;
public class ResponseServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //添加响应头以规避中文乱码
//        response.setContentType("text/html;charset=utf-8");
        //输出响应数据流给客户端
        PrintWriter writer = response.getWriter();
        writer.print("<html>");
        writer.print("<head>");
        writer.print("</head>");
        writer.print("<body>");
        writer.print("<h1>success 成功</h1>");
        writer.print("</body>");
        writer.print("</html>");
    }
}

代码整体不变,仅添加一句代码如下所示:

//添加响应头以规避中文乱码
        response.setContentType("text/html;charset=utf-8");
        //输出响应数据流给客户端
        PrintWriter writer = response.getWriter();

②转发

③重定向


八. 案例:连接数据库版的登录注册功能

案例:实现登录注册功能,要和数据库比对

8.1 注册功能

步骤:

①搭建环境

  1. 导入jar包(数据库驱动包、数据库连接池、DBUtils),放在WEB-INF下的lib目录下

  2. 创建]DBCTools和BaseDao

  3. 数据库连接池的配置文件(放到src目录下)

  4. 在MySQL中创建users表格
  5. 创建实体类(User)

②编写注册功能

  1. 创建注册页面
  2. 创建UsersDAOlmpl
  3. 创建Registe’rServlet

这里提供部分代码:

package DAO;
import bean.users;
import java.sql.SQLException;
public class UsersDAOlmpl extends BaseDAOImpl implements UsersDAO {
    @Override
    public users findUserByUsername(String username) {
        String sql="select * from users where username=?";
        try {
            return getBean(users.class, sql, username);
        } catch (Exception e) {
           throw new RuntimeException(e);
        }
    }
    @Override
    public boolean addUser(users user) {
        String sql="insert into users values(null,?,?,?)";
        try {
            int len = update(sql, user.getUsername(), user.getPassword(), user.getEmail());
            if (len>0){
                return true;
            }
            return false;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
package DAO;
import bean.users;
public interface UsersDAO {
    //注册
    //根据用户名来查找相应的用户信息
    users findUserByUsername(String username); //登录
    //添加用户
    boolean addUser(users user);
}

8.2 登录功能

步骤:

  1. 创建登录页面
  2. 创建UsersDAOlmpl
  3. 创建LoginServlet

8.3 实现效果

①测试注册功能

②测试登录功能


九. 使用Beanutils优化代码

简介:

Beanutils是一个Java库,提供了一组实用类,用于处理JavaBeans。JavaBeans是遵循特定约定的Java类,例如具有默认构造函数和用于其属性的getter和setter方法。Beanutils提供了在JavaBeans之间复制属性、将属性值转换为字符串以及执行其他与JavaBeans相关的常见任务的方法。 它是Apache Commons项目的一部分,被广泛用于Java应用程序中。

功能:

自动将map集合中的数据映射到javaBean内

使用条件:

Map集合中的key值必须和javaBean中的属性名一致,不然不一致的那个key值映射不进去

使用步骤:

  1. 导入jar包
    ①复制下面的三个jar包,然后粘贴至要应用的本地动态web项目中Web/WEB-INF/lib下


    ②在lib目录中选中刚才的三个jar包,右击打开–> Add as Library --> Create Library里选相应的参数


  2. 直接使用Beanutils调用方法即可

案例如下:对上述连接数据库版的登录注册功能的案例中的注册功能使用Beanutils进行优化

代码演示如下:

import DAO.UsersDAOlmpl;
import bean.users;
import org.apache.commons.beanutils.BeanUtils;
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.lang.reflect.InvocationTargetException;
import java.util.Map;
public class RegistServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理注册业务
      /*  String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        //数据库中user表的uid字段是自增长列
        users user=new users(null,username,password,email);*/
        //使用BeanUtils,减少代码冗余,这样即使注册表单中有300个name属性值,我也不用一个个手动输入,然后再一一添加进user对象里,那样代码量太大
        Map<String, String[]> parameterMap = req.getParameterMap();//map集合中的key值是表单中的name属性值
        users user=new users();
        try {
            BeanUtils.populate(user,parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        UsersDAOlmpl dao=new UsersDAOlmpl();
        users userByUsername = dao.findUserByUsername(user.getUsername());
        if (userByUsername==null){
            dao.addUser(user);
            req.getRequestDispatcher("regist_success.html").forward(req,resp);
        }else {
            req.getRequestDispatcher("regist_error.html").forward(req,resp);
        }
    }
}

十. web项目的路径问题 ★

10.1 url(常用)

释义:

统一资源定位符(从整个网络环境中找一个资源),例如http://localhost:9999/day06_servlet_war_exploded/login.html

相对路径相对于ur1去作为参照物

绝对路径url就是绝对路径(从ip地址开始)

涉及到路径的位置有:

  • 网页中的超链接、表单、link、img、script…
  • 转发
  • 重定向
  • web.xml

注意:

在web项目内,路径前添加/,采用的是绝对路径

建议使用绝对路径,因为绝对路径一旦写死,不管该资源上有多少个上级目录,依然可以找到,若用相对路径,则要时刻注意该资源的上级目录的变化

/代表什么含义?

  1. 服务器解析
从当前项目下开始找  例如http://localhost:9999/day06_servlet_war_exploded/
  1. ①web.xml
    例如:
<!--  设置访问loginservlet的路径  /login  -->
<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>t1.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>
  1. 上述样例设置LoginServlet的访问路径是直接从项目下访问login
<!--  设置访问loginservlet的路径  /abc/login  -->
<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>t1.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
  <url-pattern>/abc/login</url-pattern>
</servlet-mapping>
  1. 上述样例设置Loginservlet的访问路径是从项目下要先找到abc,然后从abc下找login就能找到LoginServlet
    ②转发
    例如:
//建议使用绝对路径
request.getRequestDispatcher("/second").forward(request,response);
//http://localhost:9999/day06_servlet_war_exploded/second
  1. 浏览器解析
从当前服务器下去找  例如:在 http://localhost:9999/ 下去找
  1. ①网页内所有的路径(超链接、表单、link、img、script…)
    ②重定向
    代码举例如下:
response.sendRedirect("second");//不加/,默认前面是./second
//重定向是在浏览器里解析,它是从当前服务器下去找,即http://localhost:9999/second去找,绝对找不到,遂报404
/*
解决方案:在second前面加上/day06_servlet_war_exploded/,这样就是在当前项目下去找second,一定能找到
即从http://localhost:9999/day06_servlet_war_exploded/second去找
但是这样写有一个弊端,若修改了上下文路径,代码里也得改,比较麻烦,扩展性不是很好
推荐这样写,即动态的获取上下文路径+/second
response.sendRedirect(request.getContextPath()+"/second");
*/

总结:

路径前加/,就是使用绝对路径 /的含义,由服务器解析就是当前项目下,由浏览器解析就是当前服务器下,网页内和重定向路径的/由浏览器解析。转发和web.ml中的/由服务器解析

10.2 uri(极少用)

释义:

统一资源标识符(从当前项目下找一个资源)

例如

/day06_servlet_war_exploded/login.html

在名为day06_servlet_war_exploded的war包(在服务器上部署的web项目)下去找login.html


相关文章
|
2月前
|
Java Linux 应用服务中间件
【JavaEE进阶】 Linux常用命令
【JavaEE进阶】 Linux常用命令
|
3月前
|
Web App开发 Java 测试技术
《手把手教你》系列基础篇之(四)-java+ selenium自动化测试- 启动三大浏览器(下)基于Maven(详细教程)
【2月更文挑战第13天】《手把手教你》系列基础篇之(四)-java+ selenium自动化测试- 启动三大浏览器(下)基于Maven(详细教程) 上一篇文章,宏哥已经在搭建的java项目环境中实践了,今天就在基于maven项目的环境中给小伙伴们 或者童鞋们演示一下。
98 1
|
10月前
|
Java 应用服务中间件 Linux
HTTPS && Tomcat && Servlet && 博客系统 && 软件测试的概念 && Linux
HTTPS && Tomcat && Servlet && 博客系统 && 软件测试的概念 && Linux
43 0
|
缓存 Java 应用服务中间件
【Tomcat】史上最全下载、安装配置及使用教程,(2022最新..建议收藏,教学)附Tomcat常见报错解决方法
【Tomcat】史上最全下载、安装配置及使用教程,(2022最新..建议收藏,教学)附Tomcat常见报错解决方法
1811 0
【Tomcat】史上最全下载、安装配置及使用教程,(2022最新..建议收藏,教学)附Tomcat常见报错解决方法
|
Java 应用服务中间件 容器
Servlet 之超详解【2023年最新版】(一)
Servlet 之超详解【2023年最新版】(一)
|
应用服务中间件 容器
Servlet 之超详解【2023年最新版】(二)
Servlet 之超详解【2023年最新版】(二)
|
XML 自然语言处理 Java
【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?
【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?
108 0
|
XML 前端开发 Oracle
|
Web App开发 网络协议 Ubuntu
Docker下Java文件上传服务三部曲之三
前面两章我们创建了客户端和服务端,实战了文件上传服务,本篇我们通过wireshark工具抓包,分析上传文件时的网络请求
289 0
Docker下Java文件上传服务三部曲之三
|
应用服务中间件
JavaWeb--快速入门Servlet(三)
JavaWeb--快速入门Servlet(三)
99 0
JavaWeb--快速入门Servlet(三)