welcome-file-list是一个配置在web.xml中的一个欢迎页,用于当用户在url中输入工程名称或者输入web容器url(如http://localhost:8080/)时直接跳转的页面.
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>,直接去找webcontent下的index.jsp
</welcome-file-list>
这样直接就能去index.jsp页面了,但是若是首页需要经过一些数据处理才能显示的话只能这样,在webcontent下的index.jsp中写上这样的话
<%@ page language="java" pageEncoding="UTF-8"%> <jsp:forward page="/index.do"/>
这样就去调用struts.xml中的
<action name="index" class="com.appsino.www.action.IndexProAction"> </action>
在action中是这样子的
private String templetPath; public IndexProAction(){} public String execute(){ try { String basePath="/www/templet/"; templetPath=basePath+"index.html";//index.html是freemarker生成的模板网页 Map<String, Object> data = new HashMap<String, Object>(); setData(data); getHttpResponse().setCharacterEncoding("UTF-8"); FreeMarkerUtil.createWriter(getServletContext(), data, templetPath,getHttpResponse().getWriter()); } catch (Exception e) { e.printStackTrace(); } return null; }
所有的数据处理都放在setData(data);这个方法中进行处理,FreeMarkerUtil.createWriter()方法主要是生成静态模板
/** * 设置静态化参数 * * @param data */ public void setData(Map<String, Object> data) { HttpServletRequest request=getHttpRequest(); data.put("contextPath", getContextPath());//主要是用于在html页面中的绝对路径,放在url前面的 String traAgId=String.valueOf(getTraAgId()); if(StringUtils.isNotEmpty(traAgId)){ data.put("traAgId", traAgId);//有这个id的话就是网店的数据 } if(StringUtils.isNotEmpty(traAgCode)){ data.put("traAgCode", traAgCode);//有这个code的话就是网店的数据 }else{ //当地址栏没有cityCode参数则重新获取cityCode if(StringUtils.isEmpty(cityCode)){//没有cityCode参数时 String c=readCityCookie();//主要是获取cookie String[] city=c.split(";"); if(city.length>1){ data.put("cityCode", city[0]); data.put("cityName", city[1]); }else{ data.put("cityCode", "beijing");//要是没有cookie的话就放入默认的值 data.put("cityName", "北京"); } }else{//有cityCode参数时则是自动放入当前的 data.put("cityCode", cityCode); data.put("cityName", cityName); } } // 获取参数并放入data Enumeration<String> paramNames = getHttpRequest().getParameterNames(); if (paramNames != null && paramNames.hasMoreElements()) { String name; while (paramNames.hasMoreElements()) { name = paramNames.nextElement(); if (name != null) { data.put(name, getHttpRequest().getParameter(name)); } } } //这个主要是当有游客登录时将登陆信息放在session中若是session不过期的话直接显示出游客的信息 Tourist tourist=null; tourist=((Tourist)getHttpSession().getAttribute(TCConstant.LOGIN_TOURIST)); if(tourist==null){ String touristCookie=readTAccountCookie();//获取用户的cookie if(touristCookie!=null){ tourist=getTourist(touristCookie); getHttpSession().setAttribute(TCConstant.LOGIN_TOURIST, tourist); } } if(tourist!=null){ data.put("touristName", tourist.getTouristName());//放入游客名 } }
涉及到两个方法readCityCookie()主要是获取到城市的cookie
private String cookieName="local_zone"; //读取cookie private String readCityCookie(){ String reCookie=null; HttpServletRequest request=getHttpRequest(); Cookie[] cookies = request.getCookies(); if(null!=cookies){ /** * 读取cookie * if cookie.getName.equals cityCode 则返回rcookie=""; * if cookie 未找到 把cityCode cityName 写入 COOKIE */ for(Cookie cookie : cookies){ if(cookieName.equals(cookie.getName())){ try { reCookie=URLDecoder.decode(cookie.getValue(), "UTF-8"); return reCookie; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }else{ reCookie= "beijing;北京"; setCookie(reCookie); return reCookie; } } //如果没有cookie的话 }else{ AddressUtils addressUtils = new AddressUtils();//根据IP获取城市 String ip = getIpAddr();//正式环境使用 try { cityName = addressUtils.getAddresses("ip=" + ip, "UTF-8"); if(StringUtil.isNotEmpty(cityName)){ if(cityName.contains("市")){ cityName=cityName.replaceAll("市", "").trim(); } } //addressUtils.getAddresses("ip=" + ip, "utf-8");//返回城市名 logger.info("根据ip地址获取的城市名"+cityName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } cityCode=getDCityCode(cityName); logger.info(cityCode+"code"); Cookie cookie=null; /** * 根据IP地址找到DepartureCity表的 cityCode cityName * 如果返回 unknown 则 此IP地址 所在城市 不在DepartureCity中 * 设置默认COOKIE为 “beijing;北京” */ if("unknown".equals(cityCode)){ reCookie= "beijing;北京"; setCookie(reCookie); return reCookie; }else{ reCookie=cityCode+";"+cityName; setCookie(reCookie); return reCookie; } } return reCookie; } public void setCookie(String cookieCode){ HttpServletResponse response=getHttpResponse(); Cookie cookie=null; try { logger.info("没找到匹配的时候:"+cookieCode); cookie= new Cookie(cookieName,URLEncoder.encode(cookieCode,"UTF-8")); logger.info("转化成UTF-8的时候:"+cookieName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } cookie.setMaxAge(60*60*24*365); response.addCookie(cookie); } public void rewriteCookie(String cityCode,String cityName){//重写cookie HttpServletResponse response=getHttpResponse(); AddressUtils addressUtils = new AddressUtils(); Cookie cookie=null; try { cookie= new Cookie(cookieName,cityCode+URLEncoder.encode(";"+cityName,"UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } cookie.setMaxAge(60*60*24*365); response.addCookie(cookie); } public String getDCityCode(String cityName){//根据城市获取cityCode init("departureCityService"); DepartureCity dc=new DepartureCity(); dc.setCityName(cityName); List<DepartureCity> dList=departureCityService.find(dc, ""); if(dList!=null && dList.size()>0){ logger.info("获得的城市还是code:"+dList.get(0).getCityName()); return dList.get(0).getCityCode(); } return "unknown"; } //获取IP地址 public String getIpAddr() { HttpServletRequest request=getHttpRequest(); String ip = request.getHeader("X-Real-IP"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { return ip; } ip = request.getHeader("X-Forwarded-For"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { // 多次反向代理后会有多个IP值,第一个为真实IP。 int index = ip.indexOf(','); if (index != -1) { return ip.substring(0, index); } else { return ip; } } else { return request.getRemoteAddr(); } }
获取ip的工具类
package com.appsino.www.util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; /** * 根据IP地址获取详细的地域信息 * * @project:personGocheck * @class:AddressUtils.java * @author:heguanhua E-mail:37809893@qq.com * @date:Nov 14, 2012 6:38:25 PM */ public class AddressUtils { /** * * @param content * 请求的参数 格式为:name=xxx&pwd=xxx * @param encoding * 服务器端请求编码。如GBK,UTF-8等 * @return * @throws UnsupportedEncodingException */ public String getAddresses(String content, String encodingString) throws UnsupportedEncodingException { // 这里调用taobao的接口 String urlStr = "http://ip.taobao.com/service/getIpInfo.php"; // 从taobao取得IP所在的省市区信息 String returnStr = this.getResult(urlStr, content, encodingString); if (returnStr != null) { // 处理返回的省市区信息 System.out.println(returnStr); //{"code":0,"data":{"country":"\u672a\u5206\u914d\u6216\u8005\u5185\u7f51IP","country_id":"IANA","area":"","area_id":"","region":"","region_id":"","city":"","city_id":"","county":"","county_id":"","isp":"","isp_id":"","ip":"127.0.0.1"}} String[] temp = returnStr.split(","); /*for (int i = 0; i < temp.length; i++) { System.out.println(temp[i]); } 结果 {"code":0 "data":{"country":"\u4e2d\u56fd" "country_id":"CN" "area":"\u534e\u5317" "area_id":"100000" "region":"\u5317\u4eac\u5e02" "region_id":"110000" "city":"\u5317\u4eac\u5e02" "city_id":"110000" "county":"" "county_id":"-1" "isp":"\u6b4c\u534e\u7f51\u7edc" "isp_id":"100080" "ip":"58.30.15.255"}} */ if (temp.length < 3) { return "0";// 无效IP,局域网测试 } String region = (temp[7].split(":"))[1].replaceAll("\"", ""); region = decodeUnicode(region);// 省份 /** * String country = ""; String area = ""; String region = ""; String * city = ""; String county = ""; String isp = ""; for(int * i=0;i<temp.length;i++){ switch(i){ case 1:country = * (temp[i].split(":"))[2].replaceAll("\"", ""); country = * decodeUnicode(country);//国家 break; case 3:area = * (temp[i].split(":"))[1].replaceAll("\"", ""); area = * decodeUnicode(area);//地区 break; case 5:region = * (temp[i].split(":"))[1].replaceAll("\"", ""); region = * decodeUnicode(region);//省份 break; case 7:city = * (temp[i].split(":"))[1].replaceAll("\"", ""); city = * decodeUnicode(city);//市区 break; case 9:county = * (temp[i].split(":"))[1].replaceAll("\"", ""); county = * decodeUnicode(county);//地区 break; case 11:isp = * (temp[i].split(":"))[1].replaceAll("\"", ""); isp = * decodeUnicode(isp);//ISP公司 break; } } */ // System.out.println(country+"="+area+"="+region+"="+city+"="+county+"="+isp); return region; } return null; } /** * @param urlStr * 请求的地址 * @param content * 请求的参数 格式为:name=xxx&pwd=xxx * @param encoding * 服务器端请求编码。如GBK,UTF-8等 * @return */ private String getResult(String urlStr, String content, String encoding) { URL url = null; HttpURLConnection connection = null; try { url = new URL(urlStr); connection = (HttpURLConnection) url.openConnection();// 新建连接实例 connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒 connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫秒 connection.setDoOutput(true);// 是否打开输出流 true|false connection.setDoInput(true);// 是否打开输入流true|false connection.setRequestMethod("POST");// 提交方法POST|GET connection.setUseCaches(false);// 是否缓存true|false connection.connect();// 打开连接端口 DataOutputStream out = new DataOutputStream( connection.getOutputStream());// 打开输出流往对端服务器写数据 out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxx out.flush();// 刷新 out.close();// 关闭输出流 BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据 // ,以BufferedReader流来读取 StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = reader.readLine()) != null) { buffer.append(line); } reader.close(); return buffer.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect();// 关闭连接 } } return null; } /** * unicode 转换成 中文 * * @author fanhui 2007-3-15 * @param theString * @return */ public static String decodeUnicode(String theString) { char aChar; int len = theString.length(); StringBuffer outBuffer = new StringBuffer(len); for (int x = 0; x < len;) { aChar = theString.charAt(x++); if (aChar == '\\') { aChar = theString.charAt(x++); if (aChar == 'u') { int value = 0; for (int i = 0; i < 4; i++) { aChar = theString.charAt(x++); switch (aChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = (value << 4) + aChar - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + aChar - 'a'; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': value = (value << 4) + 10 + aChar - 'A'; break; default: throw new IllegalArgumentException( "Malformed encoding."); } } outBuffer.append((char) value); } else { if (aChar == 't') { aChar = '\t'; } else if (aChar == 'r') { aChar = '\r'; } else if (aChar == 'n') { aChar = '\n'; } else if (aChar == 'f') { aChar = '\f'; } outBuffer.append(aChar); } } else { outBuffer.append(aChar); } } return outBuffer.toString(); } /** * 将字符串转成unicode * @param str 待转字符串 * @return unicode字符串 */ public static String unicode(String str) { str = (str == null ? "" : str); String tmp; StringBuffer sb = new StringBuffer(1000); char c; int i, j; sb.setLength(0); for (i = 0; i < str.length(); i++) { c = str.charAt(i); sb.append("\\u"); j = (c >>> 8); // 取出高8位 tmp = Integer.toHexString(j); if (tmp.length() == 1) sb.append("0"); sb.append(tmp); j = (c & 0xFF); // 取出低8位 tmp = Integer.toHexString(j); if (tmp.length() == 1) sb.append("0"); sb.append(tmp); } return (new String(sb)); } // 测试 public static void main(String[] args) throws UnsupportedEncodingException { /*AddressUtils addressUtils = new AddressUtils(); // 测试ip 219.136.134.157 中国=华南=广东省=广州市=越秀区=电信 String ip = "58.30.15.255";//北京市歌华有线的ip String address = ""; try { address = addressUtils.getAddresses("ip=" + ip, "utf-8").replaceAll("市", "").trim(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ //System.out.println(address);//通过ip查到是北京 //System.out.println(decodeUnicode("北京")); //System.out.println(unicode("北京"));//把北京换成unicode吗\u5317\u4eac /* gb2312的操作 System.out.println(URLEncoder.encode("beijing;北京","gb2312"));//把字符串转化成gb2312编码:beijing%3B%B1%B1%BE%A9 System.out.println(URLEncoder.encode("|","gb2312"));//|的unicode编码是%7C System.out.println(URLEncoder.encode(";","gb2312"));//;的unicode编码是%3B System.out.println(URLDecoder.decode("beijing%3B%B1%B1%BE%A9", "gb2312"));//把gb2312编码的字符串转化为中文 */ //utf-8的操作 System.out.println(URLEncoder.encode("beijing;北京","UTF-8"));//把字符串转化成UTF-8编码:beijing%3B%E5%8C%97%E4%BA%AC System.out.println(URLEncoder.encode(";","UTF-8"));//;的unicode编码是%3B System.out.println(URLDecoder.decode("beijing%3B%E5%8C%97%E4%BA%AC", "UTF-8"));//把UTF-8编码的字符串转化为中文 }
最后是freemarkerUtil
package com.appsino.www.util; public class FreeMarkerUtil { /** * 生成静态页面主方法 默认编码为UTF-8 * @param context ServletContext * @param data 一个Map的数据结果集 * @param templatePath ftl模版路径 * @param htmlPath 生成静态页面的路径 * @throws TemplateException * @throws IOException */ public static void createHTML(ServletContext context,Map<String,Object> data,String templatePath,String htmlPath) throws IOException, TemplateException{ createHTML(context, data, "UTF-8", templatePath, "UTF-8", htmlPath); } /** * 生成静态页面主方法 * @param context ServletContext * @param data 一个Map的数据结果集 * @param templatePath ftl模版路径 * @param templateEncode ftl模版编码 * @param htmlPath 生成静态页面的路径 * @param htmlEncode 生成静态页面的编码 * @throws IOException * @throws TemplateException */ public static void createHTML(ServletContext context,Map<String,Object> data,String templetEncode,String templatePath,String htmlEncode,String htmlPath) throws IOException, TemplateException{ Configuration freemarkerCfg=initCfg(context, templetEncode); //指定模版路径 Template template = freemarkerCfg.getTemplate(templatePath,templetEncode); template.setEncoding(templetEncode); //静态页面路径 File htmlFile = new File(htmlPath); if (!htmlFile.getParentFile().exists()) { htmlFile.getParentFile().mkdirs(); } Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), htmlEncode)); //处理模版 template.process(data, writer); writer.flush(); writer.close(); } /** * 处理页面后,装处理结果放入指定Out * @param context * @param data * @param templatePath * @throws TemplateModelException */ public static void createWriter(ServletContext context,Map<String,Object> data,String templatePath,Writer writer) throws TemplateModelException{ createWriter(context, data, "UTF-8", templatePath, "UTF-8",writer); } public static void createWriter(ServletContext context,Map<String,Object> data,String templetEncode,String templatePath,String htmlEncode,Writer writer) throws TemplateModelException{ Configuration freemarkerCfg=initCfg(context, templetEncode); try { //指定模版路径 Template template = freemarkerCfg.getTemplate(templatePath,templetEncode); template.setEncoding(templetEncode); //处理模版 template.process(data, writer); } catch (Exception e) { e.printStackTrace(); } } /** * 初始化freemarker配置 * @return * @throws TemplateModelException */ public static Configuration initCfg(ServletContext context,String templetEncode) throws TemplateModelException{ Configuration freemarkerCfg=null; //判断context中是否有freemarkerCfg属性 if (context.getAttribute("freemarkerCfg")!=null) { freemarkerCfg=(Configuration)context.getAttribute("freemarkerCfg"); }else { freemarkerCfg = new Configuration(); //加载模版 freemarkerCfg.setServletContextForTemplateLoading(context, "/"); freemarkerCfg.setEncoding(Locale.getDefault(), templetEncode); //加载并设置freemarker.properties Properties p = new Properties(); try { p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("freemarker.properties")); } catch (IOException e) { e.printStackTrace(); } try { freemarkerCfg.setSettings(p); } catch (TemplateException e) { e.printStackTrace(); } //加载自定义标签 //demo freemarkerCfg.setSharedVariable("demo", new DemoDirective()); //首页布局 freemarkerCfg.setSharedVariable("storeLayout", new LayoutDirective()); //导航菜单 freemarkerCfg.setSharedVariable("productCategoryList", new StoreProductCategoryDirective()); //首页栏目 freemarkerCfg.setSharedVariable("productCategoryMenuList", new StoreProductCategoryMenuDirective()); freemarkerCfg.setSharedVariable("proCatMap", new StoreProductCategoryLineDirective()); //客服 freemarkerCfg.setSharedVariable("custList", new CustServiceDirective()); //友情链接 freemarkerCfg.setSharedVariable("blogList", new BlogDirective()); //最新预订 freemarkerCfg.setSharedVariable("reservationList", new NewBookDirective()); } return freemarkerCfg; } }
在struts.xml中需要配置
<!-- freemarker管理器 --> <constant name="struts.freemarker.manager.classname" value ="com.appsino.www.freemarker.manager.TravelFreemarkerMannger" />
TravelFreemarkerMannger类
public class TravelFreemarkerMannger extends FreemarkerManager { protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException { // Configuration configuration = // super.createConfiguration(servletContext); Configuration configuration = FreeMarkerUtil.initCfg(servletContext, "utf-8"); // configuration // .setTemplateExceptionHandler(new FreemarkerExceptionHandler()); return configuration; } }
这就是整个的web流程
相关推荐
JEECMS使用目前java主流技术架构:hibernate3+struts2+spring2+freemarker。AJAX使用jquery和json实现。视图层并没有使用传统的JSP技术,而是使用更为专业、灵活、高效freemarker。 数据库使用MYSQL,并可支持orcale...
struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版 struts2 的方式自己去看简单。 spring2.5 是用注释来注入 hibernate3.2 是用ejb3注解映射关系 hibernate3 +个属性可以自动...
Struts2、Hibernate和FreeMarker是Java开发领域中常见的三个开源框架,它们分别在MVC(Model-View-Controller)架构的不同层面发挥着关键作用。这个"struts2+hibernate+freemarker"项目实例是将这三个框架集成到一起...
• 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...
整合S2SH+Freemarker,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。
总结起来,"spring+hibernate+struts2+freemarker SSH2 新闻发布系统"是一个基础的Java Web项目,展示了SSH2框架组合在实际开发中的应用。开发者可以通过学习这个小例子,理解如何整合这些技术来构建更复杂的Web应用...
· 采用hibernate3+struts2+spring2+freemarker主流技术架构 · 懂html就能建站,提供最便利、合理的使用方式 · 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对...
整合S2SH+Freemarker+oscache,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。
Struts1、Spring和Hibernate是Java Web开发中的三个重要框架,它们共同构成了SSH(Struts-Spring-Hibernate)集成框架,被广泛应用于企业级应用的开发。Freemarker则是一种强大的模板引擎,常用于生成动态HTML页面。...
Struts2、Spring、Hibernate 和 FreeMarker 是Java Web开发中常用的四大框架,它们结合使用能够构建高效、可维护的企业级应用程序。以下是对这些技术及其整合的详细解释: **Struts2** 是一个基于MVC(Model-View-...
Struts2、Spring和iBatis是Java Web开发中三个非常重要的开源框架,它们共同构建了一个灵活、可扩展且高效的应用程序开发环境。这个“struts2+spring+iBatis框架包”集成了这三个框架,使得开发者能够快速构建基于...
Struts2+Hibernate+Freemarker实现【增删改查】生成静态页面!这是一个相对网上较全的案例。源码内含数据库文件sql.sql及效果图!本人致力于完整的Demo。欢迎关注!回头补上分页。敬请期待!
Struts2.0、Spring2.5、FreeMarker和Ajax是Web开发中常见的技术栈,它们各自在应用程序架构中扮演着重要角色。Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,用于简化开发并提供强大的控制...
Struts、Spring、Hibernate 和 Freemarker 是 Java Web 开发中常用的四大框架,它们结合使用可以构建高效、可维护的Web应用程序。"Struts+Spring+Hibernate+Freemarker 新闻系统"是一个典型的MVC(Model-View-...
资源 struts2+spring2+hibernate3+tiles+freemarker+ibatis 架构图 的具体实现,注意没有java源文件,大家可以看一下配置,具体实现大家不防试一把 <br>下载架构图一目了然哦:...
在现代的Web应用程序开发中,Java Web框架的组合使用已经成为了一种常见的模式,特别是Struts 2、Hibernate、MyBatis和Spring这四个组件的整合,它们分别在MVC架构的不同层面发挥着关键作用。本课程围绕这个组合展开...
总的来说,Spring、Struts2和iBatis的整合为Java Web开发提供了一个强大、灵活的解决方案,让开发者能够更专注于业务逻辑,而不是框架的底层实现。通过合理的配置和使用这个jar包,开发者可以快速构建出稳定、高性能...