




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Lecture01_Servlet目的:掌握Servlet的生命周期1创建一个基本的Servlet12,编写与HTML表单交互的Servlet23.Servlet中常用的操作44 测试应用ServletContext实现两个Servlet之间的通信55 Session和Cookie对象76用Servlet实现上课签到应用81创建一个基本的Servlet1.创建WEB项目,名为Lecture01_Servlet,使用默认的服务器Glassfish v2,不选择框架。2.新建一个Servleta指定类名为ServletBasicb按如下图指定Servlet的内部对象名称和外部访问URL模式c完成3.打开项目中WEB-INF文件夹下的web.xml,可以看到以下内容: myFirstServlet ServletBasic myFirstServlet /myServlet 注意它与以上向导操作的对应关系。取消ServletBasic类中的注解,运行项目。默认浏览器将被启动,服务器中的index.jsp页面将被运行在浏览器中输入:http:/localhost:8080/lecture01_Servlet/myServlet在页面中将看到输出内容:Servlet ServletBasic at /lecture01_Servlet注意:所输入的http:/localhost:8080/lecture01_Servlet/myServlet中myServlet是执行ServletBasic的URL用名称,lecture01_Servlet是站点路径名,前面部分http是协议名、localhost是主机名,8080是端口号。2,编写与HTML表单交互的Servlet右选项目名:新建HTML文件,输入HTML文件名login编辑login.html,将其中的body区替换为: 用户名: 口 令: 建立一个新的Servlet类名为ServletLogin,用于接收和处理该表单中输入的用户名和口令值。设置相应的URL为loginservlet。相应的processRequest方法代码为: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); String name = request.getParameter(name); String password = request.getParameter(password); try out.println(); out.println(); out.println(Servlet ServletLogin); out.println(); out.println(); out.println(Hello + name + ,welcome !); out.println(I know your passowrd is + password + ); out.println(); out.println(); finally out.close(); 3.Servlet中常用的操作获得HTTP请求信息创建第三个Servlet,类名为ServletHttpRequest,URL访问名为myHttpRequestServlet将processRequest方法内容修改为: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); try Enumeration e = request.getHeaderNames(); /请求头名枚举 while(e.hasMoreElements() /列出所有请求头属性值 String name = (String) e.nextElement(); String value = request.getHeader(name); out.println(name+ = +value+ ); finally out.close(); accept = */* accept-language = zh-cn accept-encoding = gzip, deflate user-agent = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.6); .NET CLR 2.0.50727; 360SE) host = localhost:8080 connection = Keep-Alive cookie = JSESSIONID=74a165c8774090fdba94a8534575运行:http:/localhost:8080/lecture01_Servlet/myHttpRequestServlet输出结果为:通过request对象获得其它请求信息:Method,RequestURI,Protocol,PathInfo,RemoteAddr向ServletHttpRequest类的processRequest方法中加入以下代码: out.println(请求方法Method: +request.getMethod() +); out.println(授权类型AuthType: +request.getAuthType() +); out.println(请求URI,RequestURI: +request.getRequestURI() +); out.println(请求协议Protocol: +request.getProtocol() +); out.println(远程用户RemoteUser: +request.getRemoteUser() +); out.println(访问源地址,RemoteAddr: +request.getRemoteAddr() +); out.println(会话ID,RequestedSessionId: +request.getRequestedSessionId() +);运行,将得到以下输出结果:请求方法Method: GET 授权类型AuthType: null 请求URI,RequestURI: /lecture01_Servlet/myHttpRequestServlet 请求协议Protocol: HTTP/1.1 远程用户RemoteUser: null 访问源地址,RemoteAddr: 会话ID,RequestedSessionId: 753fbed2de0300cfece11b32525e4 测试应用ServletContext实现两个Servlet之间的通信利用一个项目中唯一的共享上下文ServletContext对象实现两个或多个Servlet之间的通信。1 覆盖ServletBasic父类中的init方法,在该方法中向ServletContext中写入两个 属性值 对。 /覆盖init方法 public void init( ) throws ServletException ServletContext ctx = this.getServletContext(); /取得Servlet运行环境的上下文对象 ctx.setAttribute(ServletBasic_name, ServletBasic); /向运行环境写入一个属性和相关的值 ctx.setAttribute(ServletBasic_description, my first Servlet); 2 创建另一个Servlet,类名为:ServletSecond,URL访问名为mySecondServlet3 对ServletSecond的processRequest方法中加入代码: /测试Servlet之间的通信 ServletContext ctx = this.getServletContext(); /取得Servlet运行环境的上下文对象 String name = (String) ctx.getAttribute(ServletBasic_name); String desc = (String) ctx.getAttribute(ServletBasic_description); 去除原有的注释,加入以下两行:out.println(自SevletBasic读取的属性:ServletBasic_name= +name + );out.println(自SevletBasic读取的属性:ServletBasic_description= +desc + );4 运行项目自SevletBasic读取的属性:ServletBasic_name=Null自SevletBasic读取的属性:ServletBasic_description=Null先运行http:/localhost:8080/lecture01_Servlet/mySecondServlet,输出结果为:说明此时并没有两个属性的值。运行:http:/localhost:8080/lecture01_Servlet/myServlet再次运行:http:/localhost:8080/lecture01_Servlet/mySecondServlet,输出结果为:自SevletBasic读取的属性:ServletBasic_name=ServletBasic自SevletBasic读取的属性:ServletBasic_description=my first Servlet说明运行myServlet后,所设置的属性信息被mySeondServlet所取得。讨论与思考:1. 这种基于共享上下文的信息交换功能有什么用?可以用它解决哪些问题?2. 聊天程序?5 Session和Cookie对象创建一个Servelt,类名为ServletSession,访问URL为mySessionServletprocessRequest代码为: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); /取得 Session对象 try Date dateCreate = new Date(session.getCreationTime(); Date dateAccess = new Date(session.getLastAccessedTime(); out.println(Session ID =+session.getId()+); out.println(Create Date Time =+dateCreate+); out.println(Last Accessed Date Time =+dateAccess+); session.setAttribute(userName, lxy); /向Session中设置属性 session.setAttribute(passWord, 1234); / /输出所有的Session值和名 Enumeration attriNames = session.getAttributeNames(); /取得Session中的全部属性 while(attriNames.hasMoreElements() /输出属性和值 String atName = (String) attriNames.nextElement(); String atValue = (String) session.getAttribute(atName); out.println(Session 属性名:+atName+,值=+atValue+); finally out.close(); 创建一个Servelt,类名为ServletCookies,访问URL为myCookiesServletprocessRequest代码为: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); Cookie cookies = request.getCookies(); for(Cookie c : cookies) String cname = c.getName(); String cvalue = c.getValue(); out.println(cname + = +cvalue+); /向cookies中添加属性 Cookie c1 = new Cookie(cookieAtt1,value1); Cookie c2 = new Cookie(cookieAtt2,value2); response.addCookie(c1); response.addCookie(c2); out.close(); 运行 http:/localhost:8080/lecture01_Servlet/myCookiesServlet注意:第一次运行,与第二次运行的区别思考与讨论:对上述Servlet可以作什么样的修改,得到一些有趣、有用的功能?6用Servlet实现上课签到应用实验内容:1. 在数据库中创建签到表2. 根据数据库创建实体类3. 根据实体类创建会话Bean4. 创建html页面,在表单中接收用户输入,提交到签到Servlet5. 创建签到Servlet,获取表单输入数据,应用会话Bean插入到数据库中。实验步骤:6.1. 在数据库中创建签到表在MySQL的test数据库中创建表signInCREATE TABLE signin ( stuNo CHAR(10) NOT NULL DEFAULT 0, signDate DATE NOT NULL DEFAULT 0000-00-00, name CHAR(20) NULL DEFAULT NULL, signTime DATETIME NULL, signIP CHAR(20) NULL,PRIMARY KEY (stuNo, signDate) ) 6.2 在WEB应用项目中基于数据库表创建实体类得到如下所示的实体类SignIn.javaEntityTable(name = signin)XmlRootElementNamedQueries( NamedQuery(name = Signin.findAll, query = SELECT s FROM Signin s), NamedQuery(name = Signin.findByStuNo, query = SELECT s FROM Signin s WHERE s.signinPK.stuNo = :stuNo), NamedQuery(name = Signin.findBySignDate, query = SELECT s FROM Signin s WHERE s.signinPK.signDate = :signDate), NamedQuery(name = Signin.findByName, query = SELECT s FROM Signin s WHERE = :name), NamedQuery(name = Signin.findBySignTime, query = SELECT s FROM Signin s WHERE s.signTime = :signTime), NamedQuery(name = Signin.findBySignIP, query = SELECT s FROM Signin s WHERE s.signIP = :signIP)public class Signin implements Serializable private static final long serialVersionUID = 1L; EmbeddedId protected SigninPK signinPK; Size(max = 20) Column(name = name) private String name; Column(name = signTime) Temporal(TemporalType.TIMESTAMP) private Date signTime; Size(max = 20) Column(name = signIP) private String signIP; public Signin() public Signin(SigninPK signinPK) this.signinPK = signinPK; public Signin(String stuNo, Date signDate) this.signinPK = new SigninPK(stuNo, signDate); public SigninPK getSigninPK() return signinPK; public void setSigninPK(SigninPK signinPK) this.signinPK = signinPK; public String getName() return name; public void setName(String name) = name; public Date getSignTime() return signTime; public void setSignTime(Date signTime) this.signTime = signTime; public String getSignIP() return signIP; public void setSignIP(String signIP) this.signIP = signIP; Override public int hashCode() int hash = 0; hash += (signinPK != null ? signinPK.hashCode() : 0); return hash; Override public boolean equals(Object object) / TODO: Warning - this method wont work in the case the id fields are not set if (!(object instanceof Signin) return false; Signin other = (Signin) object; if (this.signinPK = null & other.signinPK != null) | (this.signinPK != null & !this.signinPK.equals(other.signinPK) return false; return true; Override public String toString() return entities.Signin signinPK= + signinPK + ; 6.3 在WEB应用项目中基于实体类创建会话Bean得到如下所示的会话Bean:Statelesspublic class SigninFacade extends AbstractFacade PersistenceContext(unitName = lecture02PU) private EntityManager em; protected EntityManager getEntityManager() return em; public SigninFacade() super(Signin.class); 其中AbstractFacade为:public abstract class AbstractFacade private Class entityClass; public AbstractFacade(Class entityClass) this.entityClass = entityClass; protected abstract EntityManager getEntityManager(); public void create(T entity) getEntityManager().persist(entity); public void edit(T entity) getEntityManager().merge(entity); public void remove(T entity) getEntityManager().remove(getEntityManager().merge(entity); public T find(Object id) return getEntityManager().find(entityClass, id); public List findAll() javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass); return getEntityManager().createQuery(cq).getResultList(); public List findRange(int range) javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass); javax.persistence.Query q = getEntityManager().createQuery(cq); q.setMaxResults(range1 - range0); q.setFirstResult(range0); return q.getResultList(); public int count() javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); javax.persistence.criteria.Root rt = cq.from(entityClass); cq.select(getEntityManager().getCriteriaBuilder().count(rt); javax.persistence.Query q = getEntityManager().createQuery(cq); return (Long) q.getSingleResult().intValue(); 6.4 创建html页面 请签到 学号: 姓名: 6.4 创建响应页面请求的SignInServlet实现的代码如下:WebServlet(name = SignInServlet, urlPatterns = /si)public class SignInServlet extends HttpServlet EJB SigninFacade sf; /* * Processes requests for both HTTP GET and POST methods. * param request servlet request * param response servlet response * throws ServletException if a servlet-specific error occurs * throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); String stuNo =request.getParameter(stuNo).trim(); String name = request.getParameter(name);/ Signin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纺织专业试题及答案
- 电子基专业试题及答案
- 专业证书课程试题及答案
- 国贸专业试题及答案
- 江苏省泰州市兴化中学2025-2026学年高三上学期开学化学试题(含答案)
- 金融专业试题及答案
- 旅游法律法规试题
- 票务系统施工方案
- 地理信息系统技术标准与应用
- 入学典礼发言稿范例
- 2025天津地区国机研究院所属子公司财务总监招聘2人笔试参考题库附答案解析
- 2025证券股份面试题目及答案
- 2025上海浦东新区国资委直属单位公开招聘试题含答案
- 职工养老保险政策讲解
- 肯德基产品讲解
- 通信网络智能体白皮书
- 2025福建建工集团有限责任公司校园招聘51人笔试历年参考题库附带答案详解
- 应用软件创新创业项目商业计划书
- 行政事业单位资产管理培训
- 反邪教宣传教学课件
- 邢台市投资项目管理办法
评论
0/150
提交评论