1 使用Servlet获取数据

使用Servlet获取前端的数据,在后端从控制台中打印出前端的数据,前端页面如下图

前端页面程序:需要注意的是form的提交,以及input的不同类型对应的显示不同

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="login" method="post">
<!--Servlet根据name的名字获取相应的值-->
账号:<input type="text" name="name"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit" value="登录">
</form>
</body>
</html>

后端程序:后端需要创建相应的Servlet类

package cn.uestc;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* 使用Servlet来获取请求的参数
*/ //@WebServlet(name = "LoginServlet", urlPatterns="/login")
//使用注解的方式来配置Servlet,name=类名,urlPatterns=前段访问的地址 public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); //为了解决输出中文乱码问题,java内部要设置为utf-8
String name = request.getParameter("name");
String password = request.getParameter("password");
System.out.println("name: " + name);
System.out.println("password: " + password);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

在上面代码中有一个注解被我注释了,这是Servlet的注解有了这个在web.xml中就可以不用再写了,注解一般在小项目中使用,因为灵活方便,但在大项目中就显得不方便管理了。

因为注解被注释了,所以下面为web.xml中的配置:

<?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>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.uestc.LoginServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping> </web-app>

上面即为基础的功能,可以在此基础上进行优化,下面是多种方式的提交:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<div align="center"> <!--控制整个表单居中-->
<!--
在这里有头像的上传即是文件的上传,所以有必要了解文件上传的特殊要求
文件上传的条件
* 表单必须是post提交方式
* 表单中必须有文件上传项,文件上传项必须有name属性和值
* 表单的enctype属性必须设置为multipart/form-data
-->
<form action="/login" method="post" enctype="multipart/form-data">
<table align="center">
<tr>
<td class="td1">用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>昵称</td>
<td><input type="text" name="nickname"></td>
</tr>
<tr>
<td >性别</td>
<td> <!--单选按钮-->
<input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="female">女
</td>
</tr>
<tr>
<td >上传头像</td>
<td><input type="file" id="photo" name="upload"></td>
</tr>
<tr>
<td >兴趣爱好</td> <!--复选框-->
<td><label>
<input type="checkbox" name="hobby" value="篮球">篮球
<input type="checkbox" name="hobby" value="足球">足球
<input type="checkbox" name="hobby" value="排球">排球
<input type="checkbox" name="hobby" value="羽毛球">羽毛球
</label></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="注册">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>

2 Servlet跳转

Servlet的跳转分两种:服务端跳转与客户端跳转,在客户端跳转时相当于从新提交了申请,浏览器地址会发生改变而服务端则不会,一般常用的也是客户端跳转

代码部分稍有不同只是跳转的界面不同,当失败时没有失败界面仍是登录界面

public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); //为了解决输出中文乱码问题,java内部要设置为utf-8
String name = request.getParameter("name");
String password = request.getParameter("password");
System.out.println( "1234");
System.out.println( name +" " +password);
if ("admin".equals(name) && "123".equals(password)){
//进行服务端跳转
request.getRequestDispatcher("success.jsp").forward(request,response);
}else {
//进行客户端跳转
response.sendRedirect("index.jsp");
}
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

3 Filter拦截优化

上面实现了简单的登录功能,但有两点问题,(1)由于中文字符的问题,所以如果后续其他Servlet要用到用户名就需要在每个Servlet中进行编码设置,虽然只有一行代码但仍不想设置(2)有安全性问题,如果直接访问success.jsp那么就相当于没有登录就直接访问登录成功后的界面了。基于这两个问题的解决采用的是过滤器的方式。

UserFilter类:

public class UserFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获取配置字符集信息
this.encoding = filterConfig.getInitParameter("encoding");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//设置请求字符集
servletRequest.setCharacterEncoding(encoding); // 涉及到HTTP请求处理,转型处理
HttpServletRequest hrequest = (HttpServletRequest) servletRequest;
// 涉及到HTTP请求处理,转型处理
HttpServletResponse hresponse = (HttpServletResponse) servletResponse;
// 判断用户是否完成了登录操作,session中是否存储用户名
String loginUser = (String) hrequest.getSession().getAttribute("name");
//决定是否放行
if (loginUser == null) {
// 未登录,系统强制重定向至登录页面
hresponse.sendRedirect(hrequest.getContextPath() + "/index.jsp");
return;
} else {
filterChain.doFilter(hrequest, hresponse);
return;
}
} @Override
public void destroy() { }
}

对UserFilter类进行配置,在配置时要注意Filter要在最前面

<filter>
<filter-name>UserFilter</filter-name>
<filter-class>cn.uestc.UserFilter</filter-class>
<init-param>
<!-- 初始化中根据encoding名字寻找配置的字符集-->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter> <!-- 配置要拦截的页面 -->
<filter-mapping>
<filter-name>UserFilter</filter-name>
<url-pattern>/success.jsp</url-pattern>
</filter-mapping> <servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.uestc.LoginServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>

0

3 Servlet、Filter使用的更多相关文章

  1. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  2. java Servlet Filter 拦截Ajax请求

    /** * 版权:Copyright 2016-2016 AudaqueTech. Co. Ltd. All Rights Reserved. * 描述: * 创建人:赵巍 * 创建时间:2016年1 ...

  3. Java-maven异常-cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突

    使用maven开发web应用程序, 启动的时候报错: jar not loaded. See Servlet Spec . Offending class: javax/servlet/Servlet ...

  4. 理解Servlet过滤器 (javax.servlet.Filter)

    过滤器(Filter)的概念 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应. 在请求到达Servlet/JSP之前,过滤器截获请求. 在响应送给客户端之前,过滤器截获响 ...

  5. 使用Servlet Filter做Login checking

    1) 建一个Login Servlet: Login.java package com.my; import java.io.*; import javax.servlet.*; import jav ...

  6. Servlet Filter 2

    10.Filter常见应用 )统一全站字符编码的过滤器 通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题 案例:编写jsp 输入用户名,在Servlet中获 ...

  7. Servlet Filter 1

    1.Filter简介 )Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...

  8. Java Servlet Filter(转)

    做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求 ...

  9. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference

  10. java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter

    java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast ...

随机推荐

  1. LeetCode. 计数质数

    题目要求: 统计所有小于非负整数 n 的质数的数量. 示例i: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 代码: class Soluti ...

  2. linux下nginx搭建

    1.准备 1-1.安装 make,zlib,gcc-c++,openssl yum -y install make zlib zlib-devel gcc-c++ libtool  openssl o ...

  3. k8s-日志收集架构

    日志收集 Kubernetes 集群中监控系统的搭建,除了对集群的监控报警之外,还有一项运维工作是非常重要的,那就是日志的收集. 介绍 应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我 ...

  4. linux系统安全设置加固

        描述 设置SSH空闲超时退出时间,可降低未授权用户访问其他用户ssh会话的风险 检查提示 -- 加固建议 编辑/etc/ssh/sshd_config,将ClientAliveInterval ...

  5. 彭博社:博通正在与赛门铁克洽谈收购事宜(博通能买得起 又能讲故事的 没几个了 为了刺激资本的兴趣 只能瞎搞 就和intel 收购 麦咖啡一样。就像杜蕾斯收购美赞臣一样,也许只是纯粹的商业行为,哪行赚钱干哪行)

    彭博社今日消息,知名芯片制造商 Broadcom 公司正在就收购网络安全公司 Symantec 事宜进行高级会谈,因为 Broadcom 希望寻找半导体业务之外的机会,以实现多元化经营. 据称,在彭博 ...

  6. [NOIP10.5模拟赛]3.c题解--思维

    题目链接 这次不咕了 https://www.luogu.org/problemnew/show/AT2389 闲扯 考场20分爆搜走人 \cy 话说这几天T3都很考验思维啊 分析 我们先钦定一只鸡( ...

  7. Ubuntu18.04通过网线共享网络

    Ubuntu18.04通过网线共享网络 这几天要给实验室一个新电脑装系统,但是实验室路由器好像有点问题,所以决定共享我的笔记本的网络,但是搜了很多教程都是基于Ubuntu16.04的,而Ubuntu1 ...

  8. vue学习(8)-过渡transition&动画animate

      进入之前                                                    离开之后 v-enter---v-enter-to            v-lea ...

  9. ASP.NET如何接收清楚缓存的通知

    1 如果使用cache的add方法或者接受CacheItemPriority值得Insert方法重载接收通知,可以提供CacheItemRemovedCallBack对象,选择在清除对象时接收通知 u ...

  10. 使用SSH命令行远程登录运行在CloudFoundry上的应用

    当我试图用如下命令行采用SSH远程登录到运行在CloudFoundry环境下的应用时, cf ssh -N -T -L 9229:127.0.0.1:9229 jerry-demo-server 遇到 ...