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 注册功能
步骤:
①搭建环境
- 导入jar包(数据库驱动包、数据库连接池、DBUtils),放在WEB-INF下的lib目录下
- 创建]DBCTools和BaseDao
- 数据库连接池的配置文件(放到src目录下)
- 在MySQL中创建users表格
- 创建实体类(User)
②编写注册功能
- 创建注册页面
- 创建UsersDAOlmpl
- 创建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 登录功能
步骤:
- 创建登录页面
- 创建UsersDAOlmpl
- 创建LoginServlet
8.3 实现效果
①测试注册功能
②测试登录功能
九. 使用Beanutils优化代码
简介:
Beanutils是一个Java库,提供了一组实用类,用于处理JavaBeans。JavaBeans是遵循特定约定的Java类,例如具有默认构造函数和用于其属性的getter和setter方法。Beanutils提供了在JavaBeans之间复制属性、将属性值转换为字符串以及执行其他与JavaBeans相关的常见任务的方法。 它是Apache Commons项目的一部分,被广泛用于Java应用程序中。
功能:
自动将map集合中的数据映射到javaBean内
使用条件:
Map集合中的key值必须和javaBean中的属性名一致,不然不一致的那个key值映射不进去
使用步骤:
- 导入jar包
①复制下面的三个jar包,然后粘贴至要应用的本地动态web项目中Web/WEB-INF/lib下
②在lib目录中选中刚才的三个jar包,右击打开–> Add as Library --> Create Library里选相应的参数 - 直接使用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项目内,路径前添加/,采用的是绝对路径
建议使用绝对路径,因为绝对路径一旦写死,不管该资源上有多少个上级目录,依然可以找到,若用相对路径,则要时刻注意该资源的上级目录的变化
/代表什么含义?
- 服务器解析
从当前项目下开始找 例如http://localhost:9999/day06_servlet_war_exploded/
- ①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>
- 上述样例设置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>
- 上述样例设置Loginservlet的访问路径是从项目下要先找到abc,然后从abc下找login就能找到LoginServlet
②转发
例如:
//建议使用绝对路径 request.getRequestDispatcher("/second").forward(request,response); //http://localhost:9999/day06_servlet_war_exploded/second
- 浏览器解析
从当前服务器下去找 例如:在 http://localhost:9999/ 下去找
- ①网页内所有的路径(超链接、表单、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