简述如何实现JSP页面国际化及校验错误信息国际化:
Struts的jsp页面国际化问题,是通过资源文件来实现的。要实现国际化,需要做如下几项工作:1、定义 web.xml的ActionServlet的参数;2、定义资源文件(默认ApplicationResources.properties);3、定义JSP页面的字符集合(支持中文的UTF-8或GB2312);4、在JSP页面获取资源文件里面的内容( 轻量级与重量级框架容器的区别: 同重量级容器相比,轻量级容器没有和JavaEE容器绑定,所以它既可以运行在Web容器里,也可以再一个标准应用程序中运行,且轻量级容器的启动开销很小,无需EJB部署。轻量级容器提供了一种管理、定位业务对象的方法,不必使用JNDI寻址、定制服务器之类的额外辅助。轻量级容器为应用对象提供注册服务,较EJB重量级容器而言,它不但功能强大,而且避免了容器强制业务对象采用特定的接口,最低程度地降低了侵入性,实现了效果极佳的架构重用。(补充说明:轻量级框架和重量级框架解决问题的侧重点是不同的,轻量级框架侧重于减小开发的复杂度,相应的它的处理能力便有所减弱(如事务功能弱、不具备分布式处理能力),比较适用于开发中小型企业应用。而作为重量级框架如EJB框架则强调高可伸缩性,适合与开发大型企业应用。) JavaEE经典体系结构(四层结构) 用户层:运行于客户端机器,与用户发生交互,并把来自系统的信息显示给用户,如HTML、Applets Web层:运行于JavaEE服务器,产生表示逻辑,并接收来自表示层客户端的用户反馈,如Servlet、JSP 业务层:运行于JavaEE服务器,处理应用的核心业务逻辑,如EJB、JavaBean EIS层:运行于EIS服务器,为企业的信息系统服务,包括数据库系统、事务处理系统,该层为JavaEE应用的连接点。 什么是Servlet?Servlet有哪些特点?Servlet的生命周期及配置到web.xml的映射信息 Servlet是用Java编写的Server端程序,是一种于平台和协议的服务器端的Java应用,可以生成动态页面,是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序。与传统技术相比,Servlet具有可移植性好、功能更强大、投资更节省、效率更高、安全性更好等特点。Servlet生命周期开始于它被装入Web服务器内存时,并在被终止或被重新装入时结束,可分为阶段:装入Servlet、创建一个Servlet实例、调用Servlet的init方法(在处理任何服务请求之前的响应,用于初始化Servlet)、服务(若容器接收到对此Servlet的请求,则调用service方法)、Servlet实例被销毁(通过调用destroy方法来销毁Servlet)。 举例:Struts的ActionServlet配置信息 <%@ include file=””%>与 都是把文件包含进页面 <%@ include file=””%>是指令元素,会首先找到要包含的目标文件,然后把它插入到我们的JSP页面中; jsp:forward动作重定向与服务器端的跳转的异同: 都能跳转页面 前者是客户端跳转,后者是服务器端跳转。使用客户端跳转时,地址栏当中会显示目标资源的URL,而使用服务器端跳转时,客户浏览器的地址栏并不会显示目标地址的URL,刷新的话会重复提交请求; 内置对象request和response的常用方法: request.setAttribute(String name, Object obj):设置名字为name的request参数的值(obj) request.getAttribute(String name):返回由name指定的属性值,如果属性值不存在则返回null request.getParameter(String name):获得客户端传送给服务器端的参数值,该参数由name指定的,通常是表单中的参数 request.getParameterNames():获取客户端传送服务器端的所有参数的名字,其返回值为一个枚举的实例 request.getParameterValues():获得指定参数的所有值,参数由name指定 response.sendRedirect(String location):把响应发送到另一个位置进行处理。 Struts标签库(编程题中会有涉及) logic:iterate标签:旨在取代for或者while循环语句的标签。 Spring控制反转与依赖注入思想及Spring Bean生命周期: 对象之间的依赖关系,不由对象自身来负责,而是由容器/其他对象,依据配置文件动态建立。(补充说明:依赖注入(DI)背后的基本原理是对象之间的依赖关系只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,即Spring的控制反转。) 三种依赖注入方法:接口注入、set注入、构造器注入。如果在一个业务逻辑中,属性的值必须最先初始化,那么使用构造注入会是一个较好的选择,如果是在一个动态的不确定的环境下需要注入一个对象,但又没有必要调用构造方法而实例化一个多余的对象的情况下,使用set注入比较自然。 Spring生命周期: Bean的创建 Bean的初始化,属性值注入 Bean的调用 Bean的销毁 使用JDBC访问数据库的顺序: 装载驱动 建立Connection连接 创建Statement 执行Sql语句 关闭资源 JDBC的弊端: 步骤复杂 需要编写长长的sql语句 平台移植困难 意外的性能损失 Hibernate与JDBC相比的优点及Hibernate对象的三种状态: Hibernate是对象/关系数据库映射(Basic O/R Mapping)框架,它使用时只需要操纵对象,使开发更对象化,完全的面向对象思想;是JDBC的轻量级的对象封装,它是一个的对象持久层框架,Hibernate可以用在任何JDBC可以使用的场合;没有侵入性,是一个轻量级框架;具有很好的移植性;具备缓存机制。 Hibernate的三种状态:瞬时对象:就是一个普通对象,是用new操作符产生的;持久对象:存在于sesson的Map容器中的对象;游离对象:一个持久对象,所关联的session被关闭或被销毁则会由持久态变为游离态。 程序题: 1、使用Struts框架开发一个身份验证系统,具体要求如下: 1)对用户在登录页面中输入的数据进行检验,(1)用户输入的 “账号”和“密码”不能为空;(2)账号和密码的长度不能小于3;(3)如果不满足上述要求,在登录页面上给出恰当的提示信息。 2)如果账号=“zhangsan”,密码=“123”跳转到success.jsp页面,否则跳转到register.jsp 涉及到的核心代码如下,请你补充完整。 1. 登录页面(login.jsp) … username : password : … 2) ActionForm(loginForm.class) ….. public class LoginForm extends ActionForm { private String password; private String username; public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if("".equals(username) || username == null) { errors.add("username", new ActionMessage("error.username.required")); } else if(username.length() < 3) { errors.add("username", new ActionMessage("error.username.matchlength")); } if("".equals(password) || password == null) { errors.add("password", new ActionMessage("error.password.required")); } else if(password.length() < 3) { errors.add("password", new ActionMessage("error.password.matchlength")); } return errors; } … } 3) Action(LoginAction.class) public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = (LoginForm) form; String username = loginForm.getUsername(); String password = loginForm.getPassword(); if("zhangsan".equals(username) && "123".equals(password)) { return mapping.findForward("success"); } else { return mapping.findForward("register"); } } } 4)resource.properties error.username.required = please input username! error.password.required = please input password! error.username.matchlength = username can not be less than 3 characters error.password.matchlength = password can not be less than 3 characters 5)struts-config.xml input="/login.jsp" name="loginForm" path="/login" scope="request" type="package.action.LoginAction"> 2、使用Hibernate框架实现学生数据维护系统,具体要求如下: 1)定义实体类Student,该类包含两个属性id,name public class Student { private long id; private String name; public long getId() { return this.id; } public void setId(long id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } } 2)定义Student类的映射文件Student.hbm.xml 3)把 映射文件Student.hbm.xml加入到hibernate.cfg.xml 4)编写hbm2ddl工具类,将实体类生成数据库表 public class ExportDB { public static void main(String[] args) { Configuration config = new Configuration().configure(); SchemaExport export = new SchemaExport(config); export.create(true, true); } } 5)编写一个测试类,把一个学生的信息保存到数据库中 public class StudentTest { public static void main(String[] args) { //读取Hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); //创建SessionFactory,一个数据库对应一个SessionFactory SessionFactory fatory = cfg.buildSessionFactory(); Session session = null; session = fatory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); tx.begin(); Student student = new Student(); student.setId(0); student.setName("zhangsan"); session.save(student); tx.commit(); }catch(Exception e){ if(tx!=null) { tx.rollback(); } e.printStackTrace(); }finally{ session.close(); } } } } 实体一对多(1:n)关联: 实训实例:用户信息UserInfo一对多账户Account UserInfo实体类: public class UserInfo implements java.io.Serializable { private long userId; private String userName; private Integer userType; private String password; private String userMail; private Integer userState; private Set accounts = new HashSet(0); public UserInfo() { } // 部分getter、setter方法省略 public Set getAccounts() { return this.accounts; } public void setAccounts(Set accounts) { this.accounts = accounts; } } Account实体类: public class Account implements java.io.Serializable { private long accountId; private UserInfo userInfo; private String accountNum; private double accountBalance; private Date accountBegTime; private Integer accountType; private Integer accountState; private String idcardNum; public Account() { } // 部分getter、setter方法省略 public UserInfo getUserInfo() { return this.userInfo; } public void setUserInfo(UserInfo userInfo) { this.userInfo = userInfo; } } UserInfo.hbm.xml配置文件: //重点:UserInfo一对多Account