阶段复习之Servlet开发(二)——基础应用(表单提交及文件上传)

Servlet的表单提交

  • request对象可以获取页面请求的所有内容。
  • 即对于页面提交的表单信息,可以根据控件的name通过request.getParameter(“name”);
  • 页面多个复选框的name一般是相同的,产生的信息是个集合,所有通过hobbys=request.getParameterValues(“hobby”)获取后遍历出来。
 String username =request.getParameter("username");
 String[] hobbys=request.getParameterValues("hobby");
       for(String hobby :hobbys){
                System.out.println(hobby);
       }

response.getWriter()

•response.getWriter()返回的是PrintWriter,这是一个打印输出流。
•response.getWriter().print(),不仅可以打印输出文本格式的(包括html标签),还可以将一个对象以默认的编码方式转换为二进制字节输出
•response.getWriter().writer(),只能打印输出文本格式的(包括html标签),不可以打印对象。

 PrintWriter out=response.getWriter();
        out.print(json);
      //  response.getWriter().print(json);
        out.flush();
        out.close();

Servlet提交的中文乱码问题

可以通过转编码utf-8来解决

//提交操作转码
 String context =request.getContextPath();
 //响应操作转码
 response.setHeader("content-type","text/html;charset=UTF-8");
 //response.setCharacterEncoding("UTF-8");

转发与重定向

  • forward和redirect的区别
  • 1.从地址栏显示来说
    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
    redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
    2.从数据共享来说
    forward:转发页面和转发到的页面可以共享request里面的数据.
    redirect:不能共享数据.
    3.从运用地方来说
    forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
    redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
    4.从效率来说
    forward:高.
    redirect:低.
//请求转发,发生在服务器内部,地址栏没有转发路径变化 ————这个Servlet一共一次路径变化
request.getRequestDispatcher("/success.jsp").forward(request,response);
//请求重定向(需要加上项目名),地址栏发生变化,即为success.jsp  ————这个Servlet一共两次路径变化
//重定向可以跳转到其他项目String context =request.getContextPath();
//response.sendRedirect(context+"/success.jsp");

四大作用域

  • application(ServletContext)作用范围:整个Web应用。
  • session 域 (HttpSession) 作用范围:一次会话。默认为30分钟。
  • request域 --(HttpServletRequest) 作用范围:整个请求链(请求转发也存在)。
  • pageContext域—(PageContext) 作用范围:整个JSP页面,是四大作用域中最小的一个。
			//request.setAttribute("user",user);

            //session作用域,一次会话有效
            HttpSession session=request.getSession();
            session.setAttribute("user",user);

文件上传(通过@MultipartConfig注解方法)

  • jsp页面form的method必须是post,而且需要加enctype=“multipart/form-data”
<form id="regForm" name="regForm" method="post" action="upload" enctype="multipart/form-data">
	    	<table>
				<tr>
					<td>头像:</td>
					<td><input type="file" name="file"/>
					</td>
				</tr>
	    	</table>
	    	<input type="submit" style="height: 30px;width: 80px;" value="登录"/>
	    </form>
  • Servlet中获取文件并且保存文件到指定目录(建议重新随机生成文件名)
@WebServlet(name = "UploadServlet",urlPatterns = {"/upload"})
@MultipartConfig
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		    //判断是否选择了文件
            if(request.getPart("file").equals(false)){
                //获取上传的文件
                Part part=request.getPart("file");
                //随机生成新的文件名
                String filename = UUID.randomUUID().toString().replaceAll("-", "");
                //获取请求的信息
                String name=part.getHeader("content-disposition");
                //获取上传文件的目录
                String root="D:\\upload\\";
                System.out.println("测试上传文件的路径:"+root);
                //获取文件的后缀
                String ext=name.substring(name.lastIndexOf("."), name.length()-1);
                System.out.println("测试获取文件的后缀:"+ext);
                System.out.println("测试产生新的文件名:"+filename);
                //上传文件到指定目录
                part.write(root+filename+"."+ext);
                //新图片
                //File newfile =new File("D:\\upload\\" + filename+"."+ext);
            }else {
                System.out.println("没有选择文件");
            }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值