Servlet学习随笔

1.HttpServlet
init(ServletConfig)------Servlet生命周期中的初始方法,默认情况是服务器创建后第一次访问这个Servlet时调用,可以修改配置信息,使其在服务器一创建时就被调用;
修改配置信息的方法-----在web.xml的<servlet>下添加<load-on-startup>x<load-on-startup>,x是正整数,越小表示优先级越高
url路径的配置,完全匹配>目录匹配>(.xx)后缀名匹配>(/)缺省路径屁匹配

2.ServletContext
在服务器启动时候就会创建,作用域为整个当前Web项目
InputStream -- getResourceAsStream(src)  获得指定web项目中的文件的is;
String --- getRealPath(url)  获得指定文件的真实路径,带盘符的那种
String -- getInitParameter(name)  获得Web项目的初始化数据
初始化数据的设置方法:
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>

3.HttpServletResponse
    文件下载实现方法
设置两个头
1.Content-Disposition:attachment;filename="url"--设定程序处理数据的方式
2.Content-Type:application/x-msdownload--设定实体的mime类型
3.处理浏览器下载显示框的乱码---利用DownloadUtils处理,FIrefox使用的是Base64,其他用URL
response.getOutPutStream---获得一个输出流
       重定向
响应码为200表示响应成功,而响应码为302表示重定向。所以完成重定向的第一步就是设置响应码为302。
   public void setStatus(int sc)-----设置此响应的状态代码。
设置Location头,指定第二个请求的URL地址。
public void setHeader(String name, String value)-------用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值
便捷的重定向方法: void sendRedirect(String location)  【开发常用!!!!!】
重定向的底层:
/*response.setStatus(int sc);重定向sc=302
response.setHeader("Location","url");*/
乱码问题
响应乱码:
先要解决发送数据给服务器时的乱码
response.setCharsetEncoding("utf-8")//即让服务器以utf-8解析数据
再解决浏览器显示乱码的问题
response.setHead("Content-Type","text/html;charset=utf-8")//即给浏览器设置一个头,告诉浏览器以utf-8解析
便捷方式
response.setContentType("text/html;charset=utf-8");
请求乱码
post请求时
request.setCharacterEncoding("utf-8");
get请求时需要自己进行重新编解码
因服务器使用iso8859-1解码,即
string = new String(string.getBytes("iso8859-1"),"utf-8");

4.HttpServletRequest
请求首行的方法
String -- request.getMethod() 获得请求的方式
String -- request.getContextPath()  获得该请求相对于主机的url,即若项目为xxx/xx则获得/项目名/xxx
String -- request.getRemiteAddr()  获得请求客户端的ip

请求头的方法
String -- getHeader(name)  获得指定的请求头的value
Enumeration -- getHeaders(name) 获得指定名称header的values,封装为一个枚举类型
Eunmeration -- getHeaderNames() 获得所有请求头的name,封装为枚举类型

请求体的方法
getParameter(name)---指定name的value
String[] -- getParameterValues(name)---指定naem的多个value,用于多选框之类
Enumeration -- getParameterNames()  获得所有的请求体中name,封装为枚举类型
Map -- getParameterMap()  获得所有请求体中的数据,以键值对封装

5.BeanUtils
BeanUtils对象.population(JavaBean,parameterMap)-----将Map中的数据封装到JavaBean中

类型转换
例:转换为Date类型
DateConverter dateConverter = new DateConverter();
dateConverter.setPattern("yyyy-MM-dd");
ConvertUtils.register(dateConverter, java.util.Date.class);

6.Cookie
Cookie为服务器创建,保存在客户端的数据
底层通过response.addHeander("Set-Cookie","name=value")创建
Cookie默认存活时间为一次会话,可以通过cookie.setMaxAge(int time)设置存活时间
time<0时表示该cookie为会话级别的,=0表示追杀,>0表示手动设置存活时间,单位为s
cookie.setPath()设置cookie的路径,当要能使用此cookie,则路径必须要包括该cookie的路径
cookie.setDomain(),设置Cookie的域,看不懂,研究API
response.addCookie(cookie)----将cookie存入客户端
Cookie[] -- request.getCookies --- 获得客户端请求中的所有cookie
    概念:由服务器创建保存在客户端的会话技术
    创建:
        便捷方式:Cookie cookie = new Cookie(String name,String value);
        底层:
            创建:response.addHeader("Set-Cookie","username=zhangsan");
            获取:request.getHeader("Cookie");
    规范:
        处了IE6是20个,其余的版本和其它浏览器都是50个cookie
        cookie的默认大小为4KB
            
    获得所有Cookie:
        Cookie[] cookies = request.getCookies();
    
    Cookie的路径:它只与你归还的路径有关!默认路径为当前你访问的这个Servlet路径。
        <url-pattern>/abc/AServlet</url-pattern>
        那么此时cookie的默认路径是:/项目名/abc
        cookie的路径就是上面那个,如果想要将之前的cookie携带到服务器,你所写的路径就不需包含/项目/abc
        设置cookie路径的方法:cookie.setPath();
        
    Cookie的生命:默认是会话级别,你可以设置cookie的生命,方法为cookie.setMaxAge();如果是会话,参数<0;如果想要是持久级别的>0;当设置=0,cookie立即杀死
    
    Cookie的域:cookie.setDomain("/");
        
    其它方法:
        响应cookie:response.addCookie(cookie);
        获取cookie的名字:cookie.getName();
        获取cookie的值:cookie.getValue();
        
    Cookie是基于Http协议的!


7.Session
Session是服务器创建,保存在服务器的数据,session为域对象,作用域为一次会话
当一次会话开始,即浏览器像服务器发送请求,由服务器手动创建一个Session,当一次会话结束,即浏览器关闭,则session的JSESSIONID会丢失,session依旧存在,session的默认存活时间为30m,在Tomcat的默认web.xml中可以修改,可以手动调用session的invalidate方法来销毁session
    概念:由服务器创建并保存在服务器的会话技术
    创建:
        默认情况:
            request.getSession();        //如果session池里面有,就返回;如果没有就创建一个新的并返回
            request.getSession(true);    //如果session池里面有,就返回;如果没有就创建一个新的并返回
            request.getSession(false);    //如果session池里面有,就返回;如果没有就返回null
        如果你访问的是一个JSP页面,那么他就会为你创建一个Session
        
    Session是依赖cookie
    
    session的默认存活时间是30分钟,当然你也可以手动销毁session(session.invalidate())
    域对象的使用:
        session.setAttribute(String name,Object obj);    
        session.getAttribute(String name);
        session.removeAttribute(String name);
    获得ServletContext对象:
        session.getServletContext();
    三个域对象的对比:
        ServletContext:        服务器启动创建关闭销毁    在整个WEB应用中都有效,范围太多,慎用(统计)
        HttpSession:        默认手动调用或者访问JSP资源    在一次会话中有效。(登录)
        HttpServletRequest    默认情况第一次请求,也可以配置;在一次请求中有效!
/**
 * 文件下载实现
 *
 * @author ZZ
 *
 */
public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 通过.html文件跳转,请求中包含的文件路径,通过request对象来获得路径名
        String filename = request.getParameter("filename");
        filename = new String(filename.getBytes("iso8859-1"), "utf-8");
            /*
             *设置 第一个响应头:response.setHeader("Content-Type", fileType);
             * 其中fileType是文件的MIME类型 第二个头:response.addHeader("Content-Disposition",
             * "attachment;filename="+filename);
             * 告诉浏览器这是需要下载的一个文件,即使浏览器能够直接打开,也要给我一个下载框,filename它是文件的名称
             */
        // 通过文件的相对路径名来获得文件的MIME类型
        String mimeType = this.getServletContext().getMimeType(filename);
        // 设置第一个头Content-Type;
        response.setHeader("Content-Type", mimeType);
        System.out.println(filename+"--------01");
        System.out.println(request.getContextPath()+"--------03");
        // 通过文件的相对路径调用servletContext的方法获取一个输入流对象is
        InputStream is = this.getServletContext().getResourceAsStream(filename);
        // 通过获得浏览器的信息来更改浏览器提示的信息User-Agent头中包括了浏览器的信息
        String user_Agent = request.getHeader("User-Agent");
        // 对浏览器进行判断,分别使用不同的乱码处理方式
        if (user_Agent.contains("Firefox")) {
            // 说明是火狐浏览器
            filename = base64EncodeFileName(filename);
        } else {
            // 其它浏览器使用URL编码
            filename = URLEncoder.encode(filename, "utf-8");
        }
        System.out.println(filename+"--------02");
        // 设置第二个头Content-Disposition
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
        // 通过response对象来获得一个输出流os
        ServletOutputStream os = response.getOutputStream();
        // IO流的文件复制
        int length = 0;
        byte[] bytes = new byte[1024];
        while ((length = is.read(bytes)) != -1) {
            os.write(bytes, 0, length);
        }
        is.close();
        os.close();
    }

    /**
     * 9.火狐浏览器解决下载框的中文乱码方法
     *
     * @param fileName
     * @return
     */
    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
    /**
     * 文件上传
     *form表单上传文件
     *method="post"
     *enctype="multipart/form-data"
     */

public String saveProduct(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 先建立一个文件工程,两个参数,一个表示存放多大后进行flush刷新,另一个表示工厂的位置
        String realPath = request.getServletContext().getRealPath("/products");
        // 存储10M后进行刷新
        FileItemFactory factory = new DiskFileItemFactory(1024 * 1024 * 10, new File(realPath));
        // 建立一个Servlet文件上传对象
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        // 设置文件上传大小的限制
        fileUpload.setSizeMax(50 * 1024 * 1024);
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            // 获得所有提交数据组成的迭代器对象
            @SuppressWarnings("unchecked")
            List<FileItem> list = fileUpload.parseRequest(request);
            if (list != null) {
                // 说明有提交参数
                Iterator<FileItem> iterator = list.iterator();
                while (iterator.hasNext()) {
                    // 遍历这个迭代器
                    FileItem fileItem = iterator.next();
                    // 判断是否是file普通域对象
                    if (fileItem.isFormField()) {
                        // 说明是普通表单域对象
                        // 获得提交数据的key,即name
                        String name = fileItem.getFieldName();
                        String value = fileItem.getString("utf-8");
                        map.put(name, value);
                    } else {
                        // 说明文件表单域对象,进行文件上传
                        // 获得文件名
                        String filedName = fileItem.getName();
                        String name = fileItem.getFieldName();
                        // 创建文件对象
                        File file = new File(realPath + "/" + filedName);
                        map.put(name, "products/" + filedName);
                        // 进行写入
                        fileItem.write(file);
                    }
                }
            }
            // 将数据存入数据库
            Product product = new Product();
            BeanUtils.populate(product, map);
            // 存储product对象
            product.setPid(UUIDUtils.getId());
            product.setPflag(0);
            productService.saveProduct(product);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            return null;
        }




内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
内容概要:本文详细介绍了基于Seggiani提出的渣层计算模型,针对Prenflo气流床气化炉中炉渣的积累和流动进行了模拟。模型不仅集成了三维代码以提供气化炉内部的温度和浓度分布,还探讨了操作条件变化对炉渣行为的影响。文章通过Python代码实现了模型的核心功能,包括炉渣粘度模型、流动速率计算、厚度更新、与三维模型的集成以及可视化展示。此外,还扩展了模型以考虑炉渣组成对特性的影响,并引入了Bingham流体模型,更精确地描述了含未溶解颗粒的熔渣流动。最后,通过实例展示了氧气-蒸汽流量增加2%时的动态响应,分析了温度、流动特性和渣层分布的变化。 适合人群:从事煤气化技术研究的专业人士、化工过程模拟工程师、以及对工业气化炉操作优化感兴趣的科研人员。 使用场景及目标:①评估不同操作条件下气化炉内炉渣的行为变化;②预测并优化气化炉的操作参数(如温度、氧煤比等),以防止炉渣堵塞;③为工业气化炉的设计和操作提供理论支持和技术指导。 其他说明:该模型的实现基于理论公式和经验数据,为确保模型准确性,实际应用中需要根据具体气化炉的数据进行参数校准。模型还考虑了多个物理场的耦合,包括质量、动量和能量守恒方程,能够模拟不同操作条件下的渣层演变。此外,提供了稳态求解器和动态模拟工具,可用于扰动测试和工业应用案例分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值